我使用PRISMA与GraphQL工作。我知道有一种方法可以用密钥保护graphql服务器。例如,将密钥指定为:
secret: my-secret-42
在中prisma.yml
运行,然后运行prisma deploy
将保护graphql服务器,并且所有后续查询都需要JWT令牌才能访问它。
我可以使用以下命令生成JWT令牌
prisma token
这给了我令牌,并在标题中传递了令牌,我就可以访问它。但是有没有可以用来生成令牌的API,而不必prisma token
在CLI上手动运行命令。
我希望JavaScript通过查询直接访问GraphQL。为此,我需要某种形式的身份验证。由于将有多个用户使用该应用程序,因此我想为不同的用户使用不同的令牌。因此,我正在寻找一种方法,如果可以使用Prisma,可以使用API生成令牌。
服务令牌是一个简单的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
您是否知道如何使用pyramida指定服务名称和阶段名称?这是要做的事情
yml
吗?服务和阶段可以在您的prisma端点环境变量中定义,例如
PRISMA_ENDPOINT="http://localhost:4466/SERVICE/STAGE"
。请参阅“了解有关Prisma服务端点的更多信息”部分中的pyramida.io/docs/understand-prisma/…。