我想在 JWT 中使用基于令牌的身份验证(如果可能,已签名和加密)。我在服务器端使用 NodeJS。
我正在尝试使用这个 node-jose 模块:https : //github.com/cisco/node-jose
我对生成/存储密钥和加密算法了解不多。即使文档看起来很清楚,我也不明白部分密钥和密钥存储(直到签名部分):https : //github.com/cisco/node-jose#keys-and-key-stores
我想这取决于我需要什么,但由于我的加密水平,我不知道我需要什么......
然后在签名部分,当我需要使用密钥时,我不太了解这部分https://github.com/cisco/node-jose#keys-used-for-signing-and-verifying
我可以解释一下这些问题吗?
先感谢您。
Ed25519PEM
密钥对生成如下:
-----BEGIN PRIVATE KEY-----
NC4CAQAwBQYcK2VwBCIEIIWUb0/MoKaBxQkmmPlHIGyPfDQb/U3D6jQ+gMUGtvpa
-----END PRIVATE KEY-----
-----BEGIN PUBLIC KEY-----
NCowBQYDK2VwAyEAWFnlEbTVgD4TilnSzyDmZK16dm1IeQURtHFcLhSwmDo=
-----END PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)
在 中jose 3.11.1
,parseJwk
接受JWK
输入,用于生成用于签名和验证的密钥。将密钥jose
转换为在第三方实用程序中使用或与第三方实用程序一起使用是否有实用程序?我没有找到一个项目。PEM
JWK
paseseJwk
nodejs
我编写了一个包(我们称之为它)commons
和另一个导入它的项目。
我不想导入整个包,而只想导入该包的一个子路径。
import { client } from '@commons/clients'
相反,import { client } from '@commons'
我看到了诸如jose之类的打字稿包可以实现这种行为。
例如import createRemoteJWKSet from 'jose/jwks/remote'
。
经过一番研究,我确实发现我可以package.json
用 key 来定义这种行为exports
。js
不幸的是,据我测试,这似乎只适用于纯文本,不适用于打字稿。另外,我发现打字稿exports
在某些线程中尚不支持。像这样的包如何jose
管理这个?
我正在使用从 Microsoft 到客户端的 jwt 令牌来验证从它到 Web API(服务器)的请求。我可以控制客户端(js)和服务器(Python)的代码。
在客户端,我使用以下请求来获取令牌(用户通过租户上的密码/2FA 声明):
`https://login.microsoftonline.com/${TENANT_ID}/oauth2/v2.0/authorize
?response_type=id_token+token
&client_id=${CLIENT_ID}
&redirect_uri=${redirect_uri}
&scope=openid+email+profile
&state=${guid()}
&nonce=${guid()}`
Run Code Online (Sandbox Code Playgroud)
这里guid
有一个唯一的值,TENANT_ID
是租户和CLIENT_ID
客户。
获得此令牌后,我将其作为授权标头发送,如下所示:
init = {
headers: {
'Authorization': `Bearer ${token}`,
}
}
return fetch(url, init).then(response => {
return response.json()
})
Run Code Online (Sandbox Code Playgroud)
在服务器上,我然后检索令牌并验证它:
if 'Authorization' in request.headers and request.headers['Authorization'].startswith('Bearer '):
token = request.headers['Authorization'][len('Bearer '):]
from authlib.jose import jwt
claims = jwt.decode(token, jwk)
Run Code Online (Sandbox Code Playgroud)
jwk
的内容在哪里https://login.microsoftonline.com/{TENANT_ID}/discovery/v2.0/keys
。
整个流程一直工作到验证失败,并出现以下错误:
authlib.jose.errors.InvalidHeaderParameterName: invalid_header_parameter_name: Invalid Header Parameter Names: nonce
Run Code Online (Sandbox Code Playgroud)
这表明令牌的标头包含一个密钥nonce
(我验证了它)。
查看 Microsoft 对此的文档, …
只要了解JOSE,我就会知道JWE用于加密,JWS用于签名。我似乎无法找到示例的是经过加密和签名的有效负载。
假装我有一个有效载荷hello world
。做这样的事情是正确的吗?JWS(JWE('hello world')
加密的JWE作为JWS的有效负载?
如何从 .env 文件中的随机字符串创建 NodeJS Crypto KeyObject?
我使用jsonwebtoken来创建/验证 JWT,但它无法在 nextjs 中间件边缘函数中运行,因此我想迁移到使用jose。问题是,在 jose 中,您无法使用 .env 文件中的秘密字符串对 JWT 进行签名,您需要创建一个加密 KeyObject 并使用它来对 JWT 进行签名。
// example env file
JWT_SECRET=Swe4g7c?UBm5Nrd96vhsVDtkyJFbqKMTm!TMw5BDRLtaCFAXNvbq?s4rGKQSZnUP
Run Code Online (Sandbox Code Playgroud)
我尝试使用下面的 API 创建 KeyObject,但我收到 jose 的错误:
// example env file
JWT_SECRET=Swe4g7c?UBm5Nrd96vhsVDtkyJFbqKMTm!TMw5BDRLtaCFAXNvbq?s4rGKQSZnUP
Run Code Online (Sandbox Code Playgroud)
我还尝试使用 Uint8Array,因为jose 文档说我可以,但我收到此错误:
import crypto from 'crypto';
const key = crypto.createSecretKey(process.env.JWT_SECRET, 'utf-8');
const jwt = new jose.SignJWT(payload).sign(key);
// Error: KeyObject or CryptoKey instance for asymmetric algorithms must not be of type "secret."
Run Code Online (Sandbox Code Playgroud)
预先感谢您的任何帮助、评论、链接、资源!
jose ×6
jwt ×3
node.js ×2
cryptography ×1
encryption ×1
javascript ×1
json ×1
jwe ×1
key ×1
microsoft-identity-platform ×1
next.js ×1
package ×1
token ×1
typescript ×1