【问题标题】:How to generate the JWT token using Prisma API?如何使用 Prisma API 生成 JWT 令牌?
【发布时间】:2020-05-15 16:25:29
【问题描述】:

我正在使用 prisma 来使用 GraphQL。我知道有一种方法可以使用密钥保护 graphql 服务器。例如将密钥指定为:

secret: my-secret-42

prisma.yml 中,然后运行 ​​prisma deploy 将保护 graphql 服务器,所有后续查询都需要 JWT 令牌才能访问它。

我可以使用命令生成 JWT 令牌

prisma token

这给了我令牌并在标题中传递它时,我可以访问它。但是是否有一个 API 可以用来生成令牌,而我不必在 CLI 上手动运行 prisma token 命令。

我希望 javascript 通过查询直接访问 GraphQL。为此,我需要某种形式的身份验证。由于会有多个用户使用该应用程序,因此我希望为不同的用户提供不同的令牌。因此,如果 Prisma 可用,我正在寻找一种可以使用 API 生成令牌的方法。

【问题讨论】:

    标签: javascript reactjs graphql prisma prisma-graphql


    【解决方案1】:

    服务令牌是一个简单的 JWT 令牌,可以使用服务和阶段名称以及密钥轻松创建。您可以自己创建令牌并附加它。看看 prisma CLI 使用的实际代码:

      getToken(serviceName: string, stageName: string): string | undefined {
        if (this.secrets) {
          const data = {
            data: {
              service: `${serviceName}@${stageName}`,
              roles: ['admin'],
            },
          }
          return jwt.sign(data, this.secrets[0], {
            expiresIn: '7d',
          })
        }
    
        return undefined
      }
    

    来源:https://github.com/prisma/prisma/blob/master/cli/packages/prisma-yml/src/PrismaDefinition.ts

    有关结构的更多信息:

    服务令牌遵循 JSON Web 令牌 (JWT) 规范 (RFC 7519):

    “JSON Web Token (JWT) 是一种紧凑的、URL 安全的表示方式 要求在两方之间转让。 JWT 中的声明是 编码为 JSON 对象,用作 JSON Web 的有效负载 签名 (JWS) 结构或作为 JSON Web 加密的明文 (JWE) 结构,使声明能够进行数字签名或 使用消息验证码 (MAC) 和/或 加密。”

    一个 JWT 包含以下三个组件:

    标头:标头通常由两部分组成: 令牌,即 JWT,以及正在使用的哈希算法(即 HS256 在 Prisma 服务令牌的情况下)。

    {   "alg": "HS256",   "typ": "JWT" } 
    

    有效负载:有效负载包含声明。索赔是关于 一个实体(通常是用户)和附加数据。这就是它 看起来像部署到开发阶段的名为 demo 的服务:

    {   
       "data": {
          "service": "demo@dev",
          "roles": ["admin"]   
       },   
       "iat": 1532530208,   
       "exp": 1533135008 
    } 
    

    签名:签名用于验证消息未被更改 一路上。要创建签名部分,您必须使用 编码的标头,编码的有效载荷,秘密,指定的算法 在标题中,并签名。例如,如果您想使用 HMAC SHA256算法,签名的创建方式如下:

    HMACSHA256(base64UrlEncode(header) + '.' + base64UrlEncode(payload), secret) 
    

    因此,JWT 通常如下所示:xxxxx.yyyyy.zzzzz

    来源:https://www.prisma.io/docs/prisma-server/authentication-and-security-kke4/#service-token

    【讨论】:

    • 您知道如何使用 prisma 指定服务名称和阶段名称吗?这是要在yml 做的事情吗?
    • 服务和阶段可以在您的 prisma 端点环境变量中定义,例如PRISMA_ENDPOINT="http://localhost:4466/SERVICE/STAGE"。请参阅“了解有关 Prisma 服务端点的更多信息”部分中的prisma.io/docs/understand-prisma/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 2018-02-01
    • 2018-08-29
    • 2021-07-29
    • 2017-04-06
    • 2020-09-28
    • 2016-04-17
    相关资源
    最近更新 更多