服务令牌是一个简单的 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