firesphere / silverstripe-graphql-jwt
Requires
- php: >=7.1
- ext-json: *
- lcobucci/jwt: ^3.2
- silverstripe/framework: ^4.3
- silverstripe/graphql: ^3.0
Requires (Dev)
This package is auto-updated.
Last update: 2023-10-29 00:54:20 UTC
README
许可证
GraphQL JSON Web Token 认证器
此模块提供了一个用于创建用于认证的 JSON Web Tokens 的 JWT 接口。
安装
composer require firesphere/graphql-jwt
默认配置位于 _config\config.yml
。
为了通过 JWT 安全地处理和存储数据,您需要在 .env
文件中设置一个密钥。
JWT_SIGNER_KEY="[your secret key]"
为 JWT_SIGNER_KEY
生成安全随机值的一个快速方法是使用 PHP CLI 命令。
php -r 'echo substr(base64_encode(random_bytes(64)), 0, 64) . "\n";'
您也可以使用公钥/私钥文件。
JWT_SIGNER_KEY="./path/to/private.key" JWT_PUBLIC_KEY="./path/to/public.key"
注意:相对路径将相对于您的 BASE_PATH(以 ./
为前缀)。
目前,仅支持 RSA 密钥。不支持 ECDSA。测试文件夹中的密钥由在线 RSA 密钥生成器生成。
用于 HMAC 的签名密钥可以是任意长度(大于 B 字节的密钥首先使用 H 进行哈希)。然而,小于 L 字节的密钥强烈不推荐,因为这会降低函数的安全性强度。因此,对于 SHA-256,签名密钥的长度应在 16 到 64 字节之间。
tests/keys
中的密钥不应被信任!
配置
由于 admin/graphql 专用于 CMS GraphQL 访问,因此您需要为您的前端应用程序注册一个自定义模式,并将提供的查询和突变应用到该模式中。
例如,假设您已决定在 /api
URL 上创建一个名为 frontend
的模式
--- Name: my-graphql-schema --- SilverStripe\GraphQL\Manager: schemas: frontend: types: MemberToken: 'Firesphere\GraphQLJWT\Types\MemberTokenTypeCreator' Member: 'Firesphere\GraphQLJWT\Types\MemberTypeCreator' mutations: createToken: 'Firesphere\GraphQLJWT\Mutations\CreateTokenMutationCreator' refreshToken: 'Firesphere\GraphQLJWT\Mutations\RefreshTokenMutationCreator' queries: validateToken: 'Firesphere\GraphQLJWT\Queries\ValidateTokenQueryCreator' --- Name: my-graphql-injections --- SilverStripe\Core\Injector\Injector: SilverStripe\GraphQL\Manager.frontend: class: SilverStripe\GraphQL\Manager constructor: identifier: frontend SilverStripe\GraphQL\Controller.frontend: class: SilverStripe\GraphQL\Controller constructor: manager: '%$SilverStripe\GraphQL\Manager.frontend' --- Name: my-graphql-routes --- SilverStripe\Control\Director: rules: api: Controller: '%$SilverStripe\GraphQL\Controller.frontend' Stage: Live
登录
要生成 JWT 令牌,请向 createToken
突变发送登录请求
mutation { createToken(Email: "admin", Password: "password") { Token, // ...request or you won't have a token ID, FirstName, Surname } }
验证令牌
如果您有一个应用程序并想验证您的令牌,您可以调用 validateToken
方法
query validateToken { validateToken { Valid Message Code } }
它只需要调用端点。令牌应该在请求的头部,通过您的中间件作为 Authorization: Bearer [token]
。如果令牌有效,您将获得如下响应
{ "data": { "validateToken": { "Valid": true, "Message": "", "Code": 200, "__typename": "ValidateToken" } } }
如果令牌无效,Valid
将为 false
。
匿名令牌
尽管不建议,但可以使用匿名令牌。当使用匿名认证器时,SilverStripe 将在 Members 表中生成一个默认的数据库记录,其 Email 为 anonymous
,默认无权限。
要启用匿名令牌,将以下内容添加到您的配置 .yml
SilverStripe\Core\Injector\Injector: Firesphere\GraphQLJWT\Mutations\CreateTokenMutationCreator: properties: CustomAuthenticators: - Firesphere\GraphQLJWT\Authentication\AnonymousUserAuthenticator
然后您可以使用以下查询创建匿名登录。
mutation { createToken(Email: "anonymous") { Token } }
注意:如果默认的匿名认证器不适合您的需求,您可以将任何其他核心 SilverStripe 认证器注入到 CustomAuthenticators
。
警告:默认的 AnonymousUserAuthenticator
不适用于通用用途,因此不要将其注册到核心 Security
类下!
启用 CORS
要使用 JWT,需要启用 CORS。这可以通过将以下内容添加到您的配置 .yml
来完成
SilverStripe\GraphQL\Controller: cors: Enabled: true Allow-Origin: "*" Allow-Headers: "Authorization, Content-Type" Allow-Methods: "GET, POST, OPTIONS" Max-Age: 86400 # ...in seconds
用法
登录后,您将收到一个令牌,可用于后续请求。此令牌应包含在请求的头部,并以 Bearer
为签名。
Authorization: Bearer [token]
前缀
可以将前缀与 JWT 记录的唯一标识符相关联。这可以更容易地区分在不同上下文中创建的 JWT 记录,例如在特定域名或环境类型上。这不是出于安全目的的必需项。
JWT_PREFIX="[your secret prefix]"
安全
目前,JWT 加密的默认方法是使用 SHA256。JWT 签名使用多个因素;包括主机、受众(应用/远程用户)、一个密钥和一个令牌有效的时长范围。同一时间只能有一个设备登录。
支持的服务
默认情况下,JWT 仅支持登录。因为其令牌无法禁用,也不能用于密码更改或重置。
注意事项
当在 Apache 下的 CGI/FastCGI 模式下使用 PHP 时,Authorization
标头可能无法正确工作,请参阅 问题#15。解决方案很简单,只需在您的 .htaccess
文件中添加 SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0
即可(参考)。
示例
Postman 收集可以在 extra
文件夹中找到。
牛?
当然!
/( ,,,,, )\
_\,;;;;;;;,/_
.-"; ;;;;;;;;; ;"-.
'.__/`_ / \ _`\__.'
| (')| |(') |
| .--' '--. |
|/ o o \|
| |
/ \ _..=.._ / \
/:. '._____.' \
;::' / \ .;
| _|_ _|_ ::|
.-| '==o==' '|-.
/ | . / \ | \
| | ::| | | .|
| ( ') (. )::|
|: | |; U U ;|:: | `|
|' | | \ U U / |' | |
##V| |_/`"""`\_| |V##
##V## ##V##