

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 设置 OIDC 提供者作为身份池 IdP
<a name="open-id"></a>

[OpenID Connect](http://openid.net/connect/) 是许多登录提供程序支持的身份验证开放标准。借助 Amazon Cognito，您可以将身份与您通过 [AWS Identity and Access Management](https://aws.amazon.com/iam/) 配置的 OpenID Connect 提供者关联在一起。

**添加 OpenID Connect 提供商**

有关如何创建 OpenID Connect 提供者的信息，请参阅《AWS Identity and Access Management 用户指南》**中的[创建 OpenID Connect（OIDC）身份提供者](https://docs.aws.amazon.com/IAM/latest/UserGuide/identity-providers-oidc.html)。

**将提供商与 Amazon Cognito 关联**

**添加 OIDC 身份提供者（IdP）**

1. 从 [Amazon Cognito 控制台](https://console.aws.amazon.com/cognito/home)中选择**身份池**。选择身份池。

1. 选择**用户访问**选项卡。

1. 选择**添加身份提供者**。

1. 选择 **OpenID Connect（OIDC）**。

1. 从您的 IAM 中选择一个 **OIDC 身份提供商** IdPs 。 AWS 账户如果您想添加新的 SAML 提供者，请选择**创建新的提供者**以导航到 IAM 控制台。

1. 要设置 Amazon Cognito 在向通过该提供者进行身份验证的用户颁发凭证时请求的角色，请配置**角色设置**。

   1. 您可以为该 IdP 中的用户分配您在配置**经过身份验证的角色**时设置的**原定设置角色**，也可以**使用规则选择角色**。

     1. 如果您选择**使用规则选择角色**，请输入用户身份验证中的来源**声明**、您要用来与声明进行比较的**运算符**、导致与该角色选择匹配的**值**，以及当**角色分配**匹配时要分配的**角色**。选择**添加其他**，以根据不同的条件创建其他规则。

     1. 选择**角色解析**。当用户的声明与您的规则不匹配时，您可以拒绝凭证或为**经过身份验证的角色**颁发凭证。

1. 要更改 Amazon Cognito 在向通过该提供者进行身份验证的用户颁发凭证时分配的主体标签，请配置**访问控制属性**。

   1. 如果不应用主体标签，请选择**非活动**。

   1. 要基于 `sub` 和 `aud` 声明应用主体标签，请选择**使用原定设置映射**。

   1. 要为主体标签创建自己的自定义属性模式，请选择**使用自定义映射**。然后，对于您要在标签中表示的每个**声明**，输入要从该声明中获取的**标签键**。

1. 选择**保存更改**。

您可以将多个 OpenID Connect 提供商与一个身份池关联。

**使用 OpenID Connect**

请参阅提供商的文档，了解如何登录并接收 ID 令牌。

拥有令牌后，将此令牌添加到登录映射。使用提供程序的 URI 作为密钥。

**验证 OpenID Connect 令牌**

首次与 Amazon Cognito 集成时，您可能会收到 `InvalidToken` 异常。务必要了解 Amazon Cognito 如何验证 OpenID Connect (OIDC) 令牌。

**注意**  
如此处所述 ([https://tools.ietf.org/html/rfc7523](https://tools.ietf.org/html/rfc7523))，Amazon Cognito 提供 5 分钟的宽限期来处理系统之间的任何时钟偏差。

1. `iss` 参数必须与登录映射使用的密钥匹配（如 login.provider.com）。

1. 签名必须有效。签名必须可通过 RSA 公有密钥进行验证。
**注意**  
身份池会将 OIDC IdP 签名密钥的缓存短时间保存。如果您的提供商更改了签名密钥，则在此缓存刷新之前，Amazon Cognito 可能会返回 `NoKeyFound` 错误。如果您遇到此错误，请等待大约十分钟，让您的身份池刷新签名密钥。

1. 证书公钥的指纹与您在创建 OIDC 提供程序时在 IAM 中设置的指纹相匹配。

1. 如果存在该`azp`参数，请根据您的 OIDC 提供商 IDs 中列出的客户端检查此值。

1. 如果`azp`参数不存在，请根据您的 OIDC 提供商 IDs 中列出的客户端检查该`aud`参数。

[jwt.io](http://jwt.io/) 网站是用于解码令牌以验证这些值的宝贵资源。

## Android
<a name="set-up-open-id-1.android"></a>

```
Map<String, String> logins = new HashMap<String, String>();
logins.put("login.provider.com", token);
credentialsProvider.setLogins(logins);
```

## iOS - Objective-C
<a name="set-up-open-id-1.ios-objc"></a>

```
credentialsProvider.logins = @{ "login.provider.com": token }
```

## JavaScript
<a name="set-up-open-id-1.javascript"></a>

```
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
 IdentityPoolId: 'IDENTITY_POOL_ID',
 Logins: {
    'login.provider.com': token
 }
});
```