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

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

用户可以使用来自 OpenID Connect(OIDC)身份提供者(IdP)的现有账户登录您的应用程序。借助 OIDC 提供者,独立单点登录系统的用户可以提供现有凭证,同时您的应用程序以用户池共享格式接收 OIDC 令牌。要配置 OIDC IdP,请将您的 IdP 设置为将用户池作为 RP 处理,并将应用程序配置为将用户池作为 IdP 处理。Amazon Cognito 充当多个 OIDC IdP 和您的应用程序之间的中间环节。用户池将属性映射规则应用于提供者直接传递给用户池的 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 联合身份验证。

您可以在Amazon Web Services 管理控制台中、使用 Amazon 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 信任链的未过期公钥。

向 OIDC IdP 注册应用程序

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

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

    链接到 OIDC IdP
    OIDC IdP 如何安装 OIDC 发现 URL
    Salesforce

    Salesforce 作为 OpenID Connect 身份提供者

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

    OneLogin 连接启用 OIDC 的应用程序

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

    JumpCloud 通过 OIDC 进行 SSO

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

    Okta

    安装 Okta 身份提供者

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

    Microsoft Entra ID

    Microsoft 身份平台上的 OpenID Connect

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

    tenant 的值可以包括租户 ID、commonorganizationsconsumers

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

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

  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. 在导航栏上,选择,输入一个域,然后选择创建

  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 settings(OAuth 设置),然后在 Callback URL(回调 URL)中输入用户池域的 /oauth2/idpresponse 终端节点的 URL。这是 Salesforce 发出授权码的 URL,Amazon Cognito 会用该代码交换 OAuth 令牌。

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

  9. 选择创建

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

将 OIDC IdP 添加到用户池

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

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

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

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

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

  5. 选择一个 OpenID Connect IdP。

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

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

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

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

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

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

  11. 选择设置方法,将其作为您希望用户池确定 IdP 处关键 OIDC 联合身份验证端点路径的方式。通常,IdP 在发布者基本 URL 处托管 /well-known/openid-configuration 端点。如果您的提供者属于这种情况,则自动填写发布者 URL 选项会提示您输入该基本 URL,尝试从这里访问 /well-known/openid-configuration 路径,然后读取这里列出的端点。您可能具有非典型端点路径,或者希望通过备用代理将请求传递到一个或多个端点。在这种情况下,请选择手动输入并指定 authorizationtokenuserInfojwks_uri 端点的路径。

    注意

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

    https://login.salesforce.com

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

  12. OpenID Connect 提供者和用户池之间映射属性下配置属性映射规则。用户池属性是 Amazon Cognito 用户配置文件中的目标属性,OpenID Connect 属性是您希望 Amazon Cognito 在 ID 令牌声明或 userInfo 响应中找到的属性。Amazon Cognito 会自动将 sub OIDC 声明映射到目标用户配置文件中的 username

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

  13. 选择添加身份提供者

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

  15. 选择保存更改

API/CLI

请参阅示例二中 CreateIdentityProvider 处的 OIDC 配置。您可以修改此语法并将其用作 create-identity-providerCreateIdentityProviderUpdateIdentityProvider--cli-input-json 输入文件的请求正文。

测试 OIDC IdP 配置

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

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

此链接是当您转到应用程序客户端菜单,选择应用程序客户端,导航到登录页面选项卡,然后选择查看登录页面时,Amazon Cognito 将您引导至的页面。有关用户池域的更多信息,请参阅 配置用户池域。有关应用程序客户端(包括客户端 ID 和回调 URL)的更多信息,请参阅特定于应用程序的应用程序客户端设置

以下示例链接通过 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