如何使用 Prisma API 生成 JWT 令牌?

Posted

技术标签:

【中文标题】如何使用 Prisma API 生成 JWT 令牌?【英文标题】:How to generate the JWT token using Prisma API? 【发布时间】: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 生成令牌的方法。

【问题讨论】:

【参考方案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/…。

以上是关于如何使用 Prisma API 生成 JWT 令牌?的主要内容,如果未能解决你的问题,请参考以下文章

在客户端 API 中使用 JWT 令牌

Kong 和 JWT - API 应如何从令牌中提取信息

PHP:如何使用 JWT 从 API 注销

如何使用 JWT 身份验证获取登录用户信息?

如何在jwt中过期时刷新令牌

如果生成了新的 JWT,如何使 JWT 过期