AWS Api Gateway JWT 授权 - 获取“签名方法 HS256 无效”错误

问题描述

我已经设置了一个带有 JWT 授权方(已经内置的授权方)的 API 网关,但我无法让它接受 Twitch 生成的令牌。这是我在 AWS 中的 JWS 身份验证设置:https://i.stack.imgur.com/WR6Vi.png

我对“观众”的含义有些困惑,但我认为这必须是我的 Twitch 扩展程序的秘密,因为这是令牌首先签署的内容。 我尝试在 https://jwt.io/ 上根据秘密验证它,在勾选 secret base64 encoded 框后它说令牌有效。 问题是,每次我尝试在标头中将它传递给 API 时,我都会得到 error="invalid_token" error_description="signing method HS256 is invalid"

这是 AWS 收到的有效负载

  version: '2.0',routeKey: '$default',rawPath: '/',rawQueryString: '',headers: {
    accept: '*/*','accept-encoding': 'deflate,gzip','authorization': 'Bearer <MYTOKEN>','content-length': '0',host: '<SOMETHING>.us-west-2.amazonaws.com','user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/88.0.4324.182 Safari/537.36','x-amzn-trace-id': '<SOME ID>','x-forwarded-for': '<SOME IP>','x-forwarded-port': '443','x-forwarded-proto': 'https','x-real-ip': '<SOME IP>'
  },requestContext: {
    accountId: '<ID>',apiId: '<APP ID>',domainName: '<SOMETHING>.us-west-2.amazonaws.com',domainPrefix: '<SOMETHING>',http: {
      method: 'GET',path: '/',protocol: 'HTTP/1.1',sourceIp: '<SOME IP>',userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/88.0.4324.182 Safari/537.36'
    },requestId: '<SOME ID>',stage: '$default',time: '26/Feb/2021:17:48:04 +0000',timeEpoch: 1614361684261
  },isBase64Encoded: false
}

如您所见,它接收标头和令牌就好了。 我注意到的一件事是,当我解码令牌时,没有发行者。 AWS 如何知道 Twitch 是发行人?

  "alg": "HS256","typ": "JWT"
  }
  {
  "exp": 1614341073,"opaque_user_id": "U<SOME ID>","user_id": "<SOME ID>","channel_id": "<SOME ID>","role": "broadcaster","is_unlinked": false,"pubsub_perms": {
    "listen": [
      "broadcast","whisper-<SOME ID>","global"
    ],"send": [
      "broadcast","whisper-*"
    ]
  }
}```

解决方法

根据例外 apoc.create.relationship(),很明显 AWS 服务不支持此算法 USING PERIODIC COMMIT 500 LOAD CSV WITH HEADERS FROM "http://neo4j.com/docs/2.2.2/csv/import/roles.csv" AS csvLine MATCH (person:Person { id: toInt(csvLine.personId)}),(movie:Movie { id: toInt(csvLine.movieId)}) WITH person,movie,csvLine CALL apoc.create.relationship(person,csvLine.role,{role: csvLine.role},movie) YIELD rel RETURN * 或者您必须更改配置以通知 AWS 服务它应该使用的算法类型用于验证令牌。

进行此操作的两种方法:

  1. 让 AWS 服务了解令牌创建时使用的算法,以便 AWS 身份验证服务使用相同的算法来验证/验证令牌。

  2. 如果服务允许,请更改令牌颁发者服务端的算法。

通常令牌发行者在创建 JWT 令牌时使用以下算法之一

error="invalid_token" error_description="signing method HS256 is invalid" HS256 HS256 HS384 HS512 RS256 RS384 RS512 ES256 {{ 1}} ES384 ES512 PS256

令牌中的受众声明

aud(受众):JWT 的目标接收者。

AWS 如何知道 Twitch 是发行人?

您已经提到了 AWS 中的 JWS 身份验证设置。