如何使用 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 令牌?的主要内容,如果未能解决你的问题,请参考以下文章