【问题标题】:AWS Cognito External User Pool Identity Provider(OIDC)AWS Cognito 外部用户池身份提供商 (OIDC)
【发布时间】:2020-08-14 06:36:26
【问题描述】:

我正在使用 Cognito App Client 与外部提供商的集成 (Twitch) 用户身份验证工作正常,但由于来自身份验证服务器的代码被 Cognito 使用,我不确定我应该如何使用令牌发送 Twitch 请求,我通常会从 twitch 获得令牌,我 Cognito 不会使用此代码。我只有 Cognito 代码,我可以在 https://{my-domain}/oauth2/token 请求中使用它来换取 Cognito 令牌。请求返回 id_token、access_token 和 refresh_token,解码后的样子 标识令牌

{
  "at_hash": "yTNkeTAqzqcXCYi3yLL2Pw",
  "sub": "3cfba641-4058-475f-9818-17291175fd31",
  "cognito:groups": [
    "us-east-1_xxxxxxxxxxxx"
  ],
  "iss": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_xxxxxxxxxxxx",
  "cognito:username": "xxxxxxxxxxxx",
  "preferred_username": "xxxxxxxxxxxx",
  "nonce": "SxxlipCDVbXbcXa1H7Uf9_nM0uOurAAObUVCyreBDDux99QoAngUoiGdE0me-0Zon6fEVLLTSqD4EN1Y6_lFm48MaoBaxyywZCQKOT70gfQEfkuhlsjImJd1ko3qH3QKdlmvWSPCUZoACPYNSgR364VPELyQTVMkRTCt9eYROag",
  "aud": "35l1cn53cnj9sv1ndu8u01amk0",
  "identities": [
    {
      "userId": "xxxxxxxxxxxx",
      "providerName": "xxxxxxxxxxxx",
      "providerType": "OIDC",
      "issuer": null,
      "primary": "true",
      "dateCreated": "1588191000072"
    }
  ],
  "token_use": "id",
  "auth_time": 1588191003,
  "exp": 1588194603,
  "iat": 1588191003
}

访问令牌

{
  "sub": "3cfba641-4058-475f-9818-17291175fd31",
  "cognito:groups": [
    "us-east-1_xxxxxxxxxxxx"
  ],
  "token_use": "access",
  "scope": "aws.cognito.signin.user.admin phone openid profile email",
  "auth_time": 1588191003,
  "iss": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_xxxxxxxxxxxx",
  "exp": 1588194603,
  "iat": 1588191003,
  "version": 2,
  "jti": "55863213-c764-4b07-a386-a9c93d14e4b2",
  "client_id": "xxxxxxxxxxxx",
  "username": "xxxxxxxxxxxx"
}

如何获取用户令牌以调用 Twitch API(例如 GET https://api.twitch.tv/helix/users 端点与授权用户的令牌)

【问题讨论】:

  • 您使用 id_token 作为 Authorization 标头来调用 TwitchAPI。
  • @NghiaDo 不,id 令牌不用于授权。无论如何,我已经尝试过了。 twitch 的响应与我尝试使用 access_token 时相同 - "Must provide a valid Client-ID or OAuth token"
  • 没错。请使用 id-token 用于 OAuth 令牌
  • @Nghia你完全混淆了这些概念吗?客户端 ID,是我为 twitch 应用程序获取的客户端 ID(当我尝试通过他们的 ID 查询用户时使用它)
  • @NghiaDo 加上我已经尝试将 access_token 和 id_token 用于 Auth 标头

标签: amazon-cognito openid-connect federated-identity


【解决方案1】:

注意 - 操作不当,会将敏感属性暴露给客户端。

您需要创建 2 个版本的属性 - customdev:custom,将 oidc 提供程序属性映射到 custom (看起来像 dev:custom 不可映射),然后在 TokenGeneration_HostedAuth 触发器中您需要获取这些custom 属性,设置dev:custom 属性,然后删除customs。

似乎是一种调整,但我没有看到其他方法可以做到这一点并确保令牌安全。

解决方案是在您的用户池中创建自定义属性,然后为身份提供者映射这些属性。看起来像:

'custom:refresh_token': refresh_token
'custom:id_token': id_token
'custom:access_token': access_token

Cloudformation 模板:

用户池

....
Schema: [
    {
        AttributeDataType: 'String',
        DeveloperOnlyAttribute: true,
        Mutable: true,
        Name: 'refresh_token',
        Required: false,
    },
    {
        AttributeDataType: 'String',
        DeveloperOnlyAttribute: true,
        Mutable: true,
        Name: 'access_token',
        Required: false,
    },
    {
        AttributeDataType: 'String',
        DeveloperOnlyAttribute: true,
        Mutable: true,
        Name: 'id_token',
        Required: false,
    },
    {
        AttributeDataType: 'String',
        Mutable: true,
        Name: 'refresh_token',
        Required: false,
    },
    {
        AttributeDataType: 'String',
        Mutable: true,
        Name: 'access_token',
        Required: false,
    },
    {
        AttributeDataType: 'String',
        Mutable: true,
        Name: 'id_token',
        Required: false,
    },
],
....

用户池身份提供者

....
AttributeMapping: {
    'custom:refresh_token': 'refresh_token',
    'custom:access_token': 'access_token',
    'custom:id_token': 'id_token',
},
....

【讨论】:

  • 您是说您最终能够使用来自 Cognito 令牌交换的 access_token 通过 Twitch API 进行身份验证吗?我现在处于这个阶段,并且在成功登录后拥有我的 access_token,但是当我将它作为我的 Auth Bearer 令牌发送到 Twitch 时,我得到“无效的 OAuth 令牌”
  • @Rohan 我不确定我们是否在谈论相同的案例。请描述您要解决的问题,我可能知道如何为您提供帮助,因为我使用 Twitch API 已经很长时间了
  • 在您的原始帖子中,您的问题是使用 AWS Cognito 时无法取回 Twitch access_token。在 cmets 中,您被告知使用从 AWS 返回的 access_token,但这对我不起作用。
  • 实际上 cmets 并没有触及我的问题。根据我之前的评论,我只是想确保您使用的是 Cognito OIDC
  • 是的,使用 Cognito OIDC,当我从 AWS 收到 access_token 时,它不是 twitch access_code,因此我无法代表用户与 twitch API 进行交互。
猜你喜欢
  • 1970-01-01
  • 2018-10-08
  • 2020-06-21
  • 2021-09-23
  • 2019-04-26
  • 2021-10-26
  • 2020-05-23
  • 2018-08-20
  • 2020-09-30
相关资源
最近更新 更多