使用带有 RS256 加密的 express-jwt 在应用程序路由上解码 JWT 令牌会引发未经授权的错误

Posted

技术标签:

【中文标题】使用带有 RS256 加密的 express-jwt 在应用程序路由上解码 JWT 令牌会引发未经授权的错误【英文标题】:Decoding JWT token on app route using express-jwt with RS256 encryption throws UnAuthorized Error 【发布时间】:2021-09-18 05:49:33 【问题描述】:

我正在使用 Keycloak 进行身份验证,并使用它的中间件为我的请求附加了一个令牌。我试图编写一个使用该令牌检索用户数据的 api 路由,但是,我收到以下错误:

UnauthorizedError: error:0909006C:PEM routines:get_name:no start line

目前我正在访问“/protected/”路由上的用户数据

app.get('/protected', jwt(
  secret: Buffer.from(process.env.TOKEN_SECRET as string), 
  algorithms: ['RS256'],
  requestProperty: 'auth',
  getToken: (req: any) => 
    const token = req?.kauth?.grant?.access_token;
    if (token) 
      console.log(token.token.toString())
      return token.token.toString();
     
    return null;
  
), (req: any, res: any) => 
  return res.json(req.auth)
);

我正在从 keycloak 控制台获取我的公钥 - 但我仍然收到该错误。

** 编辑 **

将第一行和最后一行添加到密钥后:

`-----BEGIN PUBLIC KEY-----\r\n$Buffer.from(process.env.TOKEN_SECRET as string)\r\n-----END PUBLIC KEY-----`

我现在收到一个新错误:

UnauthorizedError: No authorization token was found

【问题讨论】:

【参考方案1】:

Keycloak 基本上不返回第一行和最后一行的页眉和页脚。所以需要自己添加。

const publicKey = `-----BEGIN PUBLIC KEY-----\r\n$public_key\r\n-----END PUBLIC KEY-----`

并在 express-jwt 中使用它

【讨论】:

我已经添加了这个,但现在我收到了一个新错误:UnauthorizedError: No authorization token was found 什么可能导致这个问题? 我的意思是那是你的业务逻辑问题什么的,我相信这个问题的范围已经解决了。因为您不知道现在需要添加页眉和页脚。对于当前问题,使用jwt.io 中的公钥检查您是否可以验证 jwt。

以上是关于使用带有 RS256 加密的 express-jwt 在应用程序路由上解码 JWT 令牌会引发未经授权的错误的主要内容,如果未能解决你的问题,请参考以下文章

VBA:如何根据 VBA 中的私钥生成带有 RS256 的签名?

Auth0 - 在 Owin 上使用带有承载访问令牌的 JWT 使用 RS256 进行身份验证

使用 RS256 生成的 JWT 可以被 jwt.io 网站解码吗?

更改 AWS Cognito 访问令牌 JWT 中的加密算法

Jwt介绍

Jwt介绍