向用户池添加 OIDC 身份提供商 - Amazon Cognito
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

向用户池添加 OIDC 身份提供商

您可以让已经拥有 OpenID Connect (OIDC) 身份提供商 (IdPs) 账户的用户跳过注册步骤,使用现有账户登录您的应用程序。利用内置托管 Web UI,Amazon Cognito 将为所有经过身份验证的用户提供令牌处理和管理。这样,后端系统可以基于一组用户池令牌实现标准化。


                OIDC IdP 的身份验证概述
注意

通过第三方(联合身份验证)进行登录可在 Amazon Cognito 用户池中实现。此特征不依赖于通过 Amazon Cognito 身份池(联合身份)实现的联合身份验证。

您可以通过 Amazon Web Services Management Console、或使用用户池 API 方法将 OIDC IdP 添加到您的用户池中。 Amazon CLICreateIdentityProvider

先决条件

在开始之前,您需要:

  • 具有应用程序客户端和用户池域的用户池。有关更多信息,请参阅创建用户池

  • 具有以下配置的 OIDC IdP:

    • 支持 client_secret_post 客户端身份验证。Amazon Cognito 不在 IdP 的 OIDC 发现端点上检查 token_endpoint_auth_methods_supported 声明。Amazon Cognito 不支持 client_secret_basic 客户端身份验证。有关客户端验证的更多信息,请参阅 OpenID Connect 文档中的客户端身份验证

    • 仅对 OIDC 端点使用 HTTPS,例如 openid_configurationuserInfojwks_uri

    • 仅为 OIDC 端点使用 TCP 端口 80 和 443。

    • 只能使用 HMAC-SHA、ECDSA 或 RSA 算法对 ID 令牌进行签名。

    • 在密钥的 jwks_uri 处发布密钥 ID kid 声明,并在其令牌中包含 kid 声明。

步骤 1:向 OIDC IdP 注册

在使用 Amazon Cognito 创建 OIDC IdP 之前,必须向 OIDC IdP 注册应用程序才能接收客户端 ID 和客户端密钥。

向 OIDC IdP 注册
  1. 使用 OIDC IdP 创建开发人员账户。

    与 OIDC 的链接 IdPs
    OIDC IdP 如何安装 OIDC 发现 URL
    Salesforce

    安装 Salesforce 身份提供商

    https://login.salesforce.com

    Ping Identity

    安装 Ping Identity 身份提供商

    https://您的 Ping 域地址:9031/idp/userinfo.openid

    例如:https://pf.company.com:9031/idp/userinfo.openid

    Okta

    安装 Okta 身份提供商

    https://您的 Okta 子域.oktapreview.com

    或者 https://Your Okta subdomain.okta.com

    Microsoft Azure Active Directory (Azure AD)

    安装 Microsoft Azure AD 身份提供商

    https://login.microsoftonline.com/{tenant}/v2.0

    Google

    安装 Google 身份提供商

    https://accounts.google.com

    注意

    Amazon Cognito 提供 Google 作为集成社交登录 IdP。建议使用集成 IdP。请参阅 向用户池添加社交身份提供商

  2. 向 OIDC IdP 注册具有 /oauth2/idpresponse 端点的用户池域 URL。这将确保 OIDC IdP 之后在对用户进行身份验证时通过 Amazon Cognito 接受此 URL。

    https://mydomain.us-east-1.amazoncognito.com/oauth2/idpresponse
  3. 向 Amazon Cognito 用户池注册回调 URL。这是成功身份验证后 Amazon Cognito 将您的用户重定向到的页面的 URL。

    https://www.example.com
  4. 选择 scopes(范围)。范围 openid 为必填字段。需要 email(电子邮件)范围来授予对 emailemail_verified 声明的访问权限。

  5. OIDC IdP 为您提供客户端 ID 和客户端密钥。您在用户池中设置 OIDC IdP 时将使用它们。

示例:使用 Salesforce 作为用户池的 OIDC IdP

当您要在与 OIDC 兼容的 IdP(如 Salesforce)和您的用户池之间建立信任时,请使用 OIDC IdP。

  1. 在 Salesforce 开发人员网站上创建账户

  2. 通过在上一步中设置的开发人员账户登录。

  3. 请在 Salesforce 页面上,执行以下操作之一:

    • 如果您使用的是 Lightning Experience,请选择设置齿轮图标,然后选择 Setup Home(设置主页)。

    • 如果您使用的是 Salesforce Classic 并且在用户界面标题中看到 Setup(设置),请选择它。

    • 如果您使用的是 Salesforce Classic 但没有在用户界面标题中看到 Setup(设置),请从顶部导航栏中选择您的姓名,然后从下拉列表中选择 Setup(设置)。

  4. 在左侧导航栏上,选择 Company Settings(公司设置)。

  5. 在导航栏上,选择 Domain(域),输入一个域,然后选择 Create(创建)。

  6. 在左侧导航栏上,选择在 Platform Tools(平台工具)下的 Apps(应用程序)。

  7. 选择 App Manager(应用程序管理器)。

    1. 选择 New connected app(新连接的应用程序)。

    2. 完成必填句段。

      Start URL(启动 URL)下,在 /authorize 终端节点处输入使用您的 Salesforce IdP 登录的用户池域的 URL。当您的用户访问您连接的应用程序时,Salesforce 会将他们定向到此 URL 以完成登录。然后 Salesforce 将用户重定向到与应用程序客户端关联的回调 URL。

      https://mydomain.us-east-1.amazoncognito.com/authorize?response_type=code&client_id=<your_client_id>&redirect_uri=https://www.example.com&identity_provider=CorpSalesforce
    3. 启用 OAuth settings(OAuth 设置),然后在 Callback URL(回调 URL)中输入用户池域的 /oauth2/idpresponse 终端节点的 URL。这是 Salesforce 发出授权码的 URL,Amazon Cognito 会用该代码交换 OAuth 令牌。

      https://mydomain.us-east-1.amazoncognito.com/oauth2/idpresponse
  8. 选择 scopes(范围)。您必须包含范围 openid。要授予对 emailemail_verified 声明的访问权限,请添加 email(电子邮件)范围。通过空格分隔范围。

  9. 选择 Create(创建)。

    在 Salesforce 中,客户端 ID 称为 Consumer Key(使用者密钥),客户端密钥为 Consumer Secret(使用者私有密钥)。记下您的客户端 ID 和客户端密钥。您将在下一节中使用它们。

步骤 2:将 OIDC IdP 添加到用户池

在本节中,配置用户池以通过 OIDC IdP 处理基于 OIDC 的身份验证请求。

添加 OIDC IdP(Amazon Cognito 控制台)

添加 OIDC IdP
  1. 转到 Amazon Cognito 控制台。如果出现提示,请输入您的 Amazon 凭据。

  2. 从导航菜单中选择 User Pools(用户池)。

  3. 从列表中选择一个现有用户池,或创建一个用户池

  4. 选择 Sign-in experience(登录体验)选项卡。找到 Federated sign-in(联合登录),然后选择 Add an identity provider(添加身份提供商)。

  5. 选择一个 OpenID Connect IdP。

  6. Provider name(提供商名称)中输入一个唯一名称。

  7. 将您从提供商那里收到的客户端 ID 输入到 Client ID(客户端 ID)。

  8. 将您从提供商那里收到的客户端密钥输入到 Client secret(客户端密钥)。

  9. 为该提供商输入 Authorized scopes(授权范围)。范围定义了应用程序将向您的提供商请求的用户属性组(例如 nameemail)。根据 OAuth 2.0 规范,范围必须以空格分隔。

    您的用户需要同意向您的应用程序提供这些属性。

  10. 请选择一个 Attribute request method(属性请求方法),以便为 Amazon Cognito 提供 HTTP 方法(GET 或 POST),它必须使用该方法从提供商运营的 userInfo 端点中获取用户的详细信息。

  11. 请选择 Setup method(设置方法)并通过 Auto fill through issuer URL(自动填充发布者 URL)或 Manual input(手动输入)检索 OpenID Connect 端点。当您的提供商具有公有 .well-known/openid-configuration 端点且 Amazon Cognito 可以在其中检索 authorizationtokenuserInfojwks_uri 端点的 URL 时,使用 Auto fill through issuer URL(自动填充发布者 URL)。

  12. 请输入发布者 URL 或 IdP 中的 authorizationtokenuserInfojwks_uri 端点 URL。

    注意

    URL 应该以 https:// 开头,并且不应以下斜杠 / 结尾。只有端口号 443 和 80 可用于此 URL。例如,Salesforce 使用以下 URL:

    https://login.salesforce.com

    如果选择自动填充,则发现文档必须对以下值使用 HTTPS:authorization_endpointtoken_endpointuserinfo_endpointjwks_uri。否则,登录将失败。

  13. 默认情况下,sub OIDC 声明将映射到用户池 Username(用户名)属性中。您可以将其他 OIDC 声明映射到用户池属性。输入 OIDC 声明,然后从下拉列表中选择对应的用户池属性。例如,声明 email 通常会映射到用户池属性 Email(电子邮件)。

  14. 请将 IdP 的属性映射到您的用户池。有关更多信息,请参阅指定适用于用户池的身份提供程序属性映射

  15. 选择 Create(创建)。

  16. App client integration(应用程序客户端集成)选项卡上的列表中选择一个 App clients(应用程序客户端),然后选择 Edit hosted UI settings(编辑托管 UI 设置)。将新的 OIDC IdP 添加到 Identity providers(身份提供商)下的应用程序客户端。

  17. 选择 Save changes(保存更改)。

添加 OIDC IdP (Amazon CLI)

  • 请参阅 CreateIdentityProviderAPI 方法的参数描述。

    aws cognito-idp create-identity-provider --user-pool-id string --provider-name string --provider-type OIDC --provider-details map --attribute-mapping string --idp-identifiers (list) --cli-input-json string --generate-cli-skeleton string

    使用此提供商详细信息映射:

    { "client_id": "string", "client_secret": "string", "authorize_scopes": "string", "attributes_request_method": "string", "oidc_issuer": "string", "authorize_url": "string", "token_url": "string", "attributes_url": "string", "jwks_uri": "string" }

步骤 3:测试 OIDC IdP 配置

可以通过使用上两节中的元素并使用这些元素测试 OIDC IdP 配置来创建授权 URL。

https://mydomain.us-east-1.amazoncognito.com/oauth2/authorize?response_type=code&client_id=1example23456789&redirect_uri=https://www.example.com

您可以在用户池 Domain name(域名)控制台页上找到您的域。您可以在 General settings(常规设置)页面上找到 client_id。对于 redirect_uri 参数,使用您的回调 URL。这是页面的 URL,在页面中,您的用户在身份验证成功后将被重定向。