创建 openid connect 身份提供者以保护 rest API

Creating an openid connect identity provider to secure rest APIs

我无法找到满足以下要求的有效解决方案。

一个。 ios/android 用户能够注册到我们的应用程序。使用自定义注册流程,因为需要带照片的 ID。

b。如果获得批准,请使用创建的帐户登录并访问后端 api(在 springboot 中制作)。

c。不允许外部身份提供者,例如 facebook 或 google。

我发现最适合我们微服务设计的产品是keycloak。但是,该文档确实缺乏并且没有找到正在实施的好例子。

Screenshot of creating keycloak identity provider

所以我通过 keycloakaerogear 对 ios 进行了一些配置,并有以下问题。

  1. 因为这不是基本身份验证,我相信需要的流程是授权代码流程。但是,在documentation中是说"These IDPs must support the Authorization Code Flow",但是这是什么意思呢?因为这不在任何地方的 keycloak 设置中。

  2. 用户完成此流程后将存储在何处 - 内部 keycloak 或外部数据库?

  3. 当前流程设置为 "first broker login" 但这会在应用程序上产生错误,重定向无效 url.

我目前正在研究类似的用例。我有 4 种不同的身份验证方法。我尝试开发自定义用户联合会和自定义身份提供者。我对keycloak没有太多经验,但是我可以提出我的意见。

检查 Keycloak 自定义用户联盟

这意味着,在Keycloak用户名/密码登录时使用不同的数据源(或进程)

参见 =>

  1. http://www.keycloak.org/docs/3.0/server_development/topics/user-storage/simple-example.html
  2. https://tech.smartling.com/migrate-to-keycloak-with-zero-downtime-8dcab9e7cb2c

检查自定义身份提供商

这意味着,将身份验证过程委托给外部身份提供者。

如果我对你的用例理解正确,你想自己管理身份验证过程(使用自定义页面或自定义流程)。

如果我没理解错的话,您需要将身份验证过程委托给您的自定义服务。所以你需要开发一个自定义提供者(或者一个小的假提供者服务)并且你需要将这个提供者配置为keycloak as openid connect。

对于 1 => 是的,您将使用 授权码流程。您可以从官方页面阅读 openid connect,但我建议您必须查看此页面 https://connect2id.com/learn/openid-connect。看完这篇,你可以清楚的了解openid connect和Authorization Code Flow.

创建授权代码流

有两种主要方法(服务端点)(用于原始提供商)
  • /授权
  • /令牌 您将在 link.
  • 上看到必需的参数

当您配置这些服务时 keycloak 的终点 url(参见 => http://www.keycloak.org/docs/3.3/server_admin/topics/identity-broker/oidc.html

Keycloak 将在登录页面上显示一个按钮。 Keycloak 将使用 redirect_url、scope.. help with this button 等必需参数重定向到您的 /auth 服务端点。 (您需要将此参数存储到会话或缓存中,因为 授权代码流 的下一步将需要它们)现在您可以应用自定义身份验证过程。

在你的过程之后(如果有效用户),你需要创建一个代码(必须是唯一的 像 uuid 一样,你需要将你的身份验证信息存储在缓存或地图上 => key is code value is your data) 你需要响应重定向(302 或 303)到 redirect_url 带有验证码和状态参数。 (您需要存储此代码,这将是必需的)。

在重定向 Keycloak 后直接调用你的 /token 并使用参数指向 code client_id, client_secret... (client_id and client_secret为了你的供应商安全,看完你就明白了link.)

您需要使用 code 来匹配您的身份验证数据,并且您必须响应包含 access_token 和 refresh_token 的 200 消息(in jwt format) see again link.

如果您正确创建此流程,Keycloak 将接受您的用户并根据自己的上下文进行身份验证。

对于 2 => 您将在配置身份提供者 (openid connect) 时 select 第一个登录流程。这意味着,当 Keycloak 不包含用户时,他们接受该用户,但它会询问您所需的信息,如名字、电子邮件、姓氏。您可以在 access_token 中发送名字和姓氏(如 jwt => 在 access_token 响应中声明的那样)

Keycloak 将向该用户插入自己的数据库。

对于 3 => 当我配置错误的重定向 url 时,我采用了无效的重定向 url 异常。请确保您的应用程序域地址与配置的客户端地址相同。

希望这些信息对你有用。