GraphQL 是一个由 Facebook 开发的 API 查询语言和运行时。它提供了一个API层,使得客户端可以按照自己的需要精确获取所需的数据,缩短了客户端到服务器之间的通信时间。GraphQL 替代了 RESTful API,以减少数据检索的冗余,提高了Web应用程序的性能。然而,GraphQL API服务器的安全性问题同样需要我们关注。在本文中,我们将探讨如何利用认证和授权来保护 GraphQL API。
认证
认证的目的在于确认某个用户或者应用程序是否有权访问 API 中的某些资源。不同的认证方式有不同的优缺点,应根据实际需求选择。常见的方法有:基于cookie和session的认证、JWT (JSON Web Tokens)认证、OAuth认证等。
基于cookie和Session的认证在web应用中很常见。它工作于HTTP上,并且需要在服务器端维护Session的状态。Session通过存储跟踪ID在浏览器端和服务器端进行维护。浏览器在第一次请求时,发送一个POST请求进行用户认证。服务器端验证通过后,网站将生成一个 SessionID,存储于客户端的 cookie中。之后,当客户端发出请求时,这个 SessionID 将会被发送到服务器进行身份验证。
JWT 是一个开放标准 (RFC 7519),它定义了一种紧凑且自包含的方式来在各方之间作为 JSON 对象安全地传输信息。JWT 在传输数据方面有很高的兼容性,可以方便地用于跨域、移动设备和基于 Web 的应用程序。它可以使用公钥/私钥对进行签名,使得 JWT 更加安全。
OAuth 是允许用户授权第三方应用访问其资源的协议。可以使用OAuth认证为将用户信息与其他结构分离提供支持。用户在首次登录时,需要授权给第三方平台访问其账户信息,之后授权令牌被分配给该token。 之后,每次向API发送请求时,它将始终附带这个令牌。
授权
授权允许您确定成功进行身份验证的用户或应用程序是否拥有访问API某些资源的权限以及他们能访问的内容。 GraphQL 便携式、高度可定制的程序设计范式,使得使得为不同的用户提供不同的权限变得容易。使用 GraphQL,您可以定义自己的数据访问层级,对于每一个具体的用户选择怎么样暴露哪些字段。
下面我们以JWT为例,介绍如何在 GraphQL API 中实现授权
1.首先,创建JWT模块,用户鉴权后,JWT模块会创建一个token,该token将替代用户名、密码用于授权。
// javascriptcn.com 代码示例 import jwt class JWTAuth: def __init__(self, secret_key, algorithm='HS256'): self.secret_key = secret_key self.algorithm = algorithm def encode(self, payload): return jwt.encode(payload, self.secret_key, algorithm=self.algorithm) def decode(self, token): return jwt.decode(token, self.secret_key, algorithms=[self.algorithm])
2.在 GraphQL schema 中指定 Field level 权限调用
// javascriptcn.com 代码示例 from graphene import ObjectType, String, Field, List from flask_jwt import jwt_required from db import User class UserType(ObjectType): email = String() friends = List(lambda: UserType) def resolve_friends(self, info): return [UserType(User.query.get(id)) for id in self.friend_ids] class Query(ObjectType): me = Field(UserType) @jwt_required() def resolve_me(self, info): user = User.query.filter_by(email=info.context['user_email']).first() return UserType(user)
在上述示例代码中,当用户调用API时,@jwt_required()
装饰器对数据进行身份验证。如果身份验证通过,将在 func 内创建一个 UserType 并返回它。
总结
综上所述,认证和授权对于保护 GraphQL API 很关键。传统 Web 应用程序中的认证和授权方法可用于 GraphQL API,但是为了更好地适应 GraphQL,我们应该利用GraphQL的优点,使用GraphQL自带的特性进行授权。给GraphQL实现正确的授权可以防止访问未授权的数据,保护用户信息以及重要的内部逻辑,这对于构建安全高效的 GraphQL API 是非常重要的。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/652f287a7d4982a6eb03e0ce