我目前正在研究类似的用例。我有 4 种不同的身份验证方法。我尝试开发自定义用户联合和自定义身份提供者。我对keycloak没有太多经验,但我可以提出我的意见。
检查 Keycloak 自定义用户联合
这意味着,Keycloak 用户名/密码登录时使用不同的数据源(或进程)
见 =>
- http://www.keycloak.org/docs/3.0/server_development/topics/user-storage/simple-example.html
- https://tech.smartling.com/migrate-to-keycloak-with-zero-downtime-8dcab9e7cb2c
检查自定义身份提供者
这意味着,将身份验证过程委托给外部身份提供者。
如果我正确理解了您的用例,您希望自己管理身份验证过程(使用自定义页面或自定义流程)。
如果我理解正确,您需要将身份验证过程委托给您的自定义服务。所以你需要开发一个自定义的provider(或者一个小的假provider service)并且你需要把这个provider配置成keycloak as openid connect。
For 1 => 是的,您将使用授权码流程。您可以从官方页面阅读 openid connect,但我建议您必须检查此页面https://connect2id.com/learn/openid-connect。看完这篇,你就可以清楚的了解openid connect和授权码流程了。
创建授权代码流
有两种主要方法(服务端点)(用于原始提供商)
- /认证
- /令牌
您将在link. 上看到所需的参数
当您配置这些服务时
keycloak 的端点 url (参见 => http://www.keycloak.org/docs/3.3/server_admin/topics/identity-broker/oidc.html)
Keycloak 会在登录页面上显示一个按钮。 Keycloak 将重定向到您的 /auth 服务端点,并使用所需的参数,如 redirect_url、scope.. 使用此按钮帮助。 (您需要将此参数存储到会话或缓存中,因为它们将在授权代码流程的下一步中需要)现在您可以应用自定义身份验证过程。
在您的流程之后(如果是有效用户),您需要创建一个代码(必须是唯一的
像 uuid 并且您需要将您的身份验证信息存储在缓存或地图上 => key is code value is your data)您需要使用身份验证代码和状态响应重定向(302 或 303)到 redirect_url参数。 (您需要存储此代码,它将是必需的)。
重定向 Keycloak 后直接调用 /token 并使用 code client_id、client_secret 等参数指向...(client_id 和 client_secret 用于您的提供商安全,阅读link. 后您将了解)
您需要使用 code 匹配您的身份验证数据,并且您必须响应包含 access_token 和 refresh_token (in jwt format) see again link. 的 200 消息
如果您创建此流程权限,Keycloak 将接受您的用户并在其自己的上下文中进行身份验证。
对于 2 => 您将在配置身份提供者 (openid connect) 时选择首次登录流程。这意味着,当 Keycloak 不包含用户时,他们接受该用户,但它会询问您所需的信息,如名字、电子邮件、姓氏。您可以在 access_token 中发送名字和姓氏(作为 jwt => 在 access_token 响应中的声明)
Keycloak 将把这个用户插入它自己的数据库。
For 3 => 当我配置错误的重定向 url 时,我采取了无效的重定向 url 异常。确保您的应用程序域地址与配置的客户端地址相同。
希望这些信息对你有用。