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

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

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

用户可以使用 OpenID Connect (OIDC) 身份提供商 () 提供的现有账户登录您的应用程序。IdPs借助 OIDC 提供者,独立单点登录系统的用户可以提供现有凭证,同时您的应用程序以用户池共享格式接收 OIDC 令牌。要配置 OIDC IdP,请将您的 IdP 设置为将您的用户池作为 RP 处理,并将您的应用程序配置为以 IdP 的身份处理您的用户池。Amazon Cognito 是多个 OIDC IdPs 和您的应用程序之间的中间步骤。您的用户池将属性映射规则应用于您的提供商直接传递给您的用户池的 ID 和访问令牌中的声明。然后,Amazon Cognito 会根据映射的用户属性以及您使用 Lambda 触发器对身份验证流程所做的任何其他调整来发布新令牌。

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

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

用户池 OIDC IdP 身份验证流程

有关此身份验证流程OIDC 用户池 IdP 身份验证流程的更多详细信息,请参阅。

注意

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

您可以通过 AWS Management Console、或使用用户池 API 方法将 OIDC IdP 添加到您的用户池中。 AWS 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 声明。

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

向 OIDC IdP 注册应用程序

在将 OIDC IdP 添加到用户池配置并将其分配给应用程序客户端之前,您需要在 IdP 中设置一个 OIDC 客户端应用程序。您的用户池是用于管理您的 IdP 身份验证的中继方应用程序。

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

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

    作为 OpenID Connect 身份提供商的 Salesforce

    https://MyDomainName.my.salesforce.com/.well-known/openid-configuration

    OneLogin Connect 启用了 OIDC 的应用程序

    https://your-domain.onelogin.com/oidc/2/.well-known/openid-configuration

    JumpCloud 通过 OIDC 进行单点登录

    https://oauth.id.jumpcloud.com/.well-known/openid-configuration

    Okta

    安装 Okta 身份提供商

    https://Your Okta subdomain.okta.com/.well-known/openid-configuration

    Microsoft Entra ID

    微软身份平台上的 OpenID Connect

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

    的值tenant可以包括租户 ID commonorganizations、或consumers

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

    https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/idpresponse
  3. 选择您希望用户目录与用户池共享的范围OIDC 需要使用作用域 openid IdPs 才能提供任何用户信息。需要email范围才能授予对emailemail_verified主张的访问权限。OIDC 规范中的其他作用域profile适用于所有用户属性以及和phonephone_number phone_number_verified

  4. 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.auth.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 设置并在回调 URL 中输入您的用户池域的/oauth2/idpresponse终端节点 URL。这是 Salesforce 发布授权码的网址,Amazon Cognito 用该代码兑换令牌。 OAuth

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

  9. 选择 Create(创建)。

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

将 OIDC IdP 添加到用户池

设置 IdP 后,您可以将用户池配置为使用 OIDC IdP 处理身份验证请求。

Amazon Cognito console
在控制台中添加 OIDC IdP
  1. 转到 Amazon Cognito 控制台。如果出现提示,请输入 AWS 凭证。

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

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

  4. 选择 “社交和外部提供商” 菜单,然后选择 “添加身份提供商”。

  5. 选择一个 OpenID Connect IdP。

  6. 输入唯一的提供商名称

  7. 输入 IdP 客户端 ID。这是您在 OIDC IdP 中构建的应用程序客户端的 ID。您提供的客户端 ID 必须是您配置的回传 URL 的 OIDC 提供商。https://[your user pool domain]/oauth2/idpresponse

  8. 输入 IdP 客户机密钥。这必须是上一步中同一应用程序客户端的客户端密钥。

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

    您的 IdP 可能会提示用户在登录时同意向您的应用程序提供这些属性。

  10. 选择属性请求方法。 IdPs可能需要将其userInfo终端节点的请求格式设置为GETPOST。例如,Amazon Cognito userInfo 终端节点需要HTTP GET请求。

  11. 选择一种设置方法,让您的用户池确定您的 IdP 上关键 OIDC 联邦端点的路径。通常,在颁发者基本 URL 上 IdPs 托管/well-known/openid-configuration终端节点。如果您的提供商遇到这种情况,则自动填写发行商网址选项会提示您输入该基本网址,尝试从那里访问该/well-known/openid-configuration路径,然后读取那里列出的端点。您可能有非典型的终端节点路径,或者希望通过备用代理将请求传递到一个或多个终端节点。在这种情况下,请选择手动输入并指定authorizationtokenuserInfo、和jwks_uri端点的路径。

    注意

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

    https://login.salesforce.com

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

  12. OpenID Connect 提供商和用户池之间的 “映射属性” 下配置属性映射规则。用户池属性是 Amazon Cognito 用户个人资料中的目标属性,OpenID Conn ect 属性是你希望 Amazon Cognito 在 ID-Token 索赔或响应中找到的来源属性。userInfoAmazon Cognito 会自动将 OIDC 索赔订阅映射到目标用户个人username资料中。

    有关更多信息,请参阅 将 IdP 属性映射到配置文件和令牌

  13. 选择添加身份提供商

  14. 从 “应用程序客户端” 菜单中,从列表中选择一个应用程序客户端。导航到 “登录页面” 选项卡,在 “托管登录页面配置” 下,选择 “编辑”。找到身份提供者并添加您的新 OIDC IdP。

  15. 选择保存更改

API/CLI

请参阅示例二中的 OIDC 配置,网址为。CreateIdentityProvider您可以修改此语法并将其用作CreateIdentityProviderUpdateIdentityProvider、的请求正文或的--cli-input-json输入文件create-identity-provider

测试 OIDC IdP 配置

在您的应用程序中,您必须在用户的客户端中调用浏览器,这样他们才能使用其 OIDC 提供商登录。完成前几节中的设置过程后,请向您的提供商测试登录。以下示例网址会加载带有前缀域名的用户池的登录页面。

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

当您进入应用程序客户端菜单,选择应用程序客户端,导航到登录页面选项卡,然后选择查看登录页面时,Amazon Cognito 会引导您进入该页面。有关用户池域的更多信息,请参阅 配置用户池域。有关应用程序客户端(包括客户端 IDs 和回调)的更多信息 URLs,请参阅特定于应用程序的应用程序客户端设置

以下示例链接对端点授权使用identity_provider查询参数设置了从的静默重定向到MyOIDCIdP提供商。此 URL 绕过使用托管登录的交互式用户池登录,直接转到 IdP 登录页面。

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