温馨提示:本文翻译自stackoverflow.com,查看原文请点击:javascript - How to generate the JWT token using Prisma API?

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

发布于 2020-03-30 21:42:35

我使用PRISMA与GraphQL工作。我知道有一种方法可以用密钥保护graphql服务器。例如,将密钥指定为:

secret: my-secret-42

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

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

prisma token

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

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

查看更多

提问者
Amanda
被浏览
42
realAlexBarge 2020-02-03 17:35

服务令牌是一个简单的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令牌(JWT)是一种紧凑的,URL安全的方法,用于表示要在两方之间转移的声明。JWT中的声明被编码为JSON对象,用作JSON Web签名(JWS)的有效负载结构或作为JSON Web加密(JWE)结构的纯文本,使声明可以进行数字签名或使用消息身份验证代码(MAC)进行完整性保护和/或加密。”

JWT具有以下三个组成部分:

标头:标头通常由两部分组成:令牌的类型(即JWT)和所使用的哈希算法(在Prisma服务令牌的情况下为HS256)。

{   "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