【问题标题】:Invalid Bearer Access Token无效的承载访问令牌
【发布时间】:2019-10-01 11:16:35
【问题描述】:

我们正在使用 hapi-auth-jwt2jwks-rsa 来解码和验证 azureAD 访问令牌。

这是我们的 jwt 策略,它在每条路由上都有效。

'use strict'

const jwt = require('hapi-auth-jwt2')
const jwksRsa = require('jwks-rsa')
const userCtrl = require('./../controllers/UserController')
const authHandler = require('./auth.factory').GetAuthHandler()

// TODO: Replace with current JSON web token formatting and active directory

module.exports = {
  name: 'JWT Authentication',
  register: async (server, options) => {
    await server.register(jwt)
    // Confirm that we are getting the correct PK
    // const pk = await authHandler.GetPK()
    const key = jwksRsa.hapiJwt2KeyAsync({
      cache: true,
      rateLimit: true,
      jwksRequestsPerMinute: 5,
      // jwksUri: 'https://YOUR_DOMAIN/.well-known/jwks.json'
      jwksUri: 'https://login.microsoftonline.com/common/discovery/keys'
      // https://login.microsoftonline.com/common/discovery/keys
      // https://login.microsoftonline.com/common/.well-known/openid-configuration
    })

    server.auth.strategy('jwt', 'jwt', {
      // Get the complete decoded token, because we need info from the header (the kid)
      complete: true,
      // Dynamically provide a signing key based on the kid in the header and the singing keys provided by the JWKS endpoint.
      key: key,
      // key: pk,
      headerKey: 'authorization',
      tokenType: 'Bearer',
      validate: userCtrl.validate,
      verifyOptions: {
        algorithms: ['RS256'] // or HS256 RS256
      }
    })
    server.auth.default('jwt')
    console.log(key)
  }
}

然后我们将Authorization 标头(即'Bearer ' + accessToken)附加到http 并从locahost 即当前客户端/前端向/sso 路由发出请求,服务器返回以下请求/响应

[1569928136140] INFO  (11252 on PORT230): request completed
    req: {
      "id": "1569928136137:PORT230:11264:k17qg99b:10001",
      "method": "get",
      "url": "https://port230.5874.com/api/v2/user/sso",
      "headers": {
        "host": "port230.5874.com",
        "connection": "keep-alive",
        "accept": "application/json, text/plain, */*",
        "origin": "http://localhost:8080",
        "authorization": "Bearer ...",
        "user-agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36",
        "sec-fetch-mode": "cors",
        "sec-fetch-site": "cross-site",
        "referer": "http://localhost:8080/",
        "accept-encoding": "gzip, deflate, br",
        "accept-language": "en-US,en;q=0.9"
      }
    }
    res: {
      "statusCode": 401,
      "headers": {
        "www-authenticate": "Bearer error=\"Invalid token\"",
        "content-type": "application/json; charset=utf-8",
        "vary": "origin",
        "access-control-allow-origin": "http://localhost:8080",
        "access-control-expose-headers": "WWW-Authenticate,Server-Authorization",
        "strict-transport-security": "max-age=15768000",
        "x-frame-options": "DENY",
        "x-xss-protection": "1; mode=block",
        "x-download-options": "noopen",
        "x-content-type-options": "nosniff",
        "cache-control": "no-cache",
        "content-length": 106
      }
    }
    responseTime: 3

响应包括"www-authenticate": "Bearer error=\"Invalid token\""。我们一直在尝试了解为什么会出现 Invalid Token 错误但没有取得多大成功。

有谁知道这个错误何时以及为什么会抛出,以及如何克服它?

【问题讨论】:

  • 您认为"authorization": "Bearer ..." 中的... 是否正确?
  • @JaromandaX 出于逻辑原因,访问令牌未包含在上述请求中。使用 jwt.io 可以解码令牌,但使用 jwt 策略时不能解码
  • 我不是要你出示token,我是问它是否正确
  • @JaromandaX 这就是问题所在,因为它返回无效。我们如何确认它是否正确?我们通过在前端调用 getToken(MSAL.js 的一部分)来获取它,然后我们返回 accessTokenResponse.accessToken 并将其附加到 http 标头
  • @bba278 我的意思是,如果您获得 Microsoft Graph 的访问令牌,则可以使用它来使用 Microsoft Graph。如果您使用 Graph 访问令牌来使用您自己的自定义 API,它不会工作。

标签: javascript azure azure-active-directory rsa hapijs


【解决方案1】:

问题是我们没有正确定义https://portal.azure.com 上的API 范围。在我们修复后,我们使用新创建的范围创建了 API 权限,因此访问令牌被成功解码

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 2021-02-12
    • 1970-01-01
    • 2020-09-11
    • 2020-01-26
    • 2019-03-13
    • 2017-09-07
    相关资源
    最近更新 更多