将 OIDC 身份提供者与用户池配合使用 - Amazon Cognito

将 OIDC 身份提供者与用户池配合使用

用户可以使用来自 OpenID Connect(OIDC)身份提供者(IdP)的现有账户登录您的应用程序。借助 OIDC 提供者,独立单点登录系统的用户可以提供现有凭证,同时您的应用程序以用户池共享格式接收 OIDC 令牌。用户池是一个 OIDC IdP,它也可以充当多个外部 OIDC IdP 和您的应用程序之间的中间依赖方。

使用 OIDC IdP 登录的用户无需提供新的凭证或信息即可访问您的用户池应用程序。您的应用程序可以静默地将他们重定向到其 IdP 进行登录,在后台使用用户池作为工具,用于标准化应用程序的令牌格式。要了解有关 IdP 重定向的更多信息,请参阅对端点授权

与其他第三方身份提供者一样,您必须向 OIDC 提供者注册您的应用程序,并获取有关要连接到用户池的 IdP 应用程序的信息。用户池 OIDC IdP 需要客户端 ID、客户端密钥、您要请求的范围以及有关提供者服务端点的信息。您的用户池可以从发现端点发现提供者 OIDC 端点,也可以手动输入它们。您还必须检查提供者 ID 令牌,并在 IdP 和用户池中的属性之间创建属性映射。

OIDC IdP 的身份验证概述
注意

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

您可以在AWS Management Console中、使用 AWS CLI 或使用用户池 API 方法 CreateIdentityProvider 向用户池添加 OIDC IdP。

先决条件

在开始之前,您需要:

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

  • 具有以下配置的 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 声明。

    • 提供具有有效根 CA 信任链的未过期公钥。

步骤 1:向 OIDC IdP 注册

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

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

    链接到 OIDC IdP
    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 控制台。如果出现提示,请输入 AWS 凭证。

  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 (AWS CLI)

  • 请参阅 CreateIdentityProvider API 方法的参数描述。

    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,在页面中,您的用户在身份验证成功后将被重定向。