Amazon Cognito,自定义 OpenID 提供商,"Invalid login token" 错误

Amazon Cognito, custom OpenID provider, "Invalid login token" error

我正在尝试将 Cognito 与自定义 OpenID 提供商结合使用,以在我的 iOS 应用程序中访问 AWS 服务。作为自定义 OpenID 提供者,我将我们的 WP 服务器与 WP OAuth 服务器插件一起使用。我成功地从 IAM 控制台创建了身份提供者(检查了指纹,它是正确的)。之后,我创建了具有默认角色的身份池,并在 "Authentication providers" -> OpenID 选项卡中选择了之前创建的提供者。现在在 iOS 应用程序中,我正在尝试使用以下代码获取 identityId:

AWSCognitoCredentialsProvider *credentialsProvider =
    [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AWSRegionUSEast1
                                               identityPoolId:poolId];
NSString *domain = @"my.dev.somename.com";
NSString *accessToken = <correct and actual oauth access token>;
credentialsProvider.logins = @{domain: accessToken};

AWSServiceConfiguration *configuration =
        [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1
                                    credentialsProvider:credentialsProvider];

    [AWSServiceManager defaultServiceManager].defaultServiceConfiguration = configuration;

[[credentialsProvider getIdentityId] continueWithBlock:^id(AWSTask *task) {
        if (task.error) {
            NSLog(@"Error: %@", task.error.localizedDescription);
        }
        else {
            NSLog(@"identityID: %@", task.result);
        }
        return nil;
    }];

而且每次我都有 "GetId failed. ... Invalid login token." 错误 (NotAuthorizedException)。 同时访问令牌有效且未过期,因为我可以使用它与服务器通信。创建提供者时使用的受众和代码中使用的 poolId 肯定是正确的。

我不确定这是否有帮助,但需要提及我们的服务器支持使用 Facebook 登录,所以为了测试,我已将 Facebook 作为经过身份验证的提供者添加到身份池中并且它起作用了:我能够以这种方式获取 identityId。

有人可以帮忙吗?

更新:

斯科特的回答是正确的。这里唯一的问题 - 无法从 WP OAuth 服务器插件请求 OpenID 令牌(至少对于我正在使用的版本 3.1.5)。该插件似乎只支持三足授权流程,我们这里有两足。所以我最终得到了使用 "Developer Authenticated Identities Authflow" 的自定义 WP 插件(参见 docs) and custom developer authenticated provider (code example)。希望这会对某人有所帮助。

确保您使用的授权类型 returns 是一个有效的 OpenID 连接令牌(WP OAuth 服务器看起来支持不同的 tokens/grant 类型)。您可以使用 jwt.io 来解码后端发出的令牌。验证有关令牌的以下内容:

  1. iss 参数必须与登录映射中使用的键匹配(例如 login.provider.com)。
  2. 签名必须有效。签名必须可通过 RSA public 密钥进行验证。
  3. 托管 public 密钥的证书指纹与您的 OpenId Connect 提供商上配置的相匹配。
  4. 如果存在 azp 参数,请对照您的 OpenId Connect 提供商中列出的客户端 ID 检查此值。
  5. 如果 azp 参数不存在,请根据您的 OpenId Connect 提供商中列出的客户端 ID 检查 aud 参数。