使用Keycloak实现单点登录

4
我有一个Rails应用程序,在后端使用Keycloak API进行身份验证。但是现在我想将单点登录与Keycloak集成。 当用户导航到登录页面时,他们将被重定向到Keycloak登录页面。Keycloak将处理所有登录选项。一旦用户成功验证,他们将被重定向到仪表板。
如有需要,我们会提供帮助。

你好,我和keycloak有同样的目标。我使用来自 nov 的 openid-connect gem(https://github.com/nov/openid_connect)。他还提供了一些用于测试目的的 ruby 应用程序,但它们并没有随 keycloak 服务器一起提供。至今需要对他的 openid-connect-sample-rp 存储库进行一些修改。您有任何改进吗? - tingel2k
你能否使用我的答案将Keycloak与Rails集成? - tingel2k
好的,如果您有任何问题,请告诉我,我将示例移植到了一个正式的独立rails应用程序中。现在具备“发现”功能。 - tingel2k
1个回答

2
所以我将尝试描述如何在Keycloak和Rails中使用OpenID。首先,我使用了来自nov的示例repo,并进行了以下更改。

首先,我必须配置webrick使用ssl 从这里举个例子,并且需要为keycloak服务器配置ssl(从这里获取信息,但不包括openshift参考,这是您的客户端应连接的地方)。

我对webrick进行了一些修改,每次启动都会生成新的证书,并将实际有效证书存储在临时文件中,以便openid调用可以使用相同的证书,但如果您使用静态证书,则此操作是过时的。

现在,您需要将提供程序(keycloak服务器)设置输入到提供程序模型中。您可以通过从此链接使用浏览器从keycloak服务器获取有关接口的信息:

https://keycloak-url:PORT/auth/realms/REALM-NAME/.well-known/openid-configuration

我建议修改./db/seeds.rb文件

{issuer: "https://keycloak-url:PORT/auth/realms/REALM-NAME",
authorization_endpoint: "https://keycloak-url:PORT/auth/realms/REALM-NAME/protocol/openid-connect/auth",
token_endpoint: "https://keycloak-url:PORT/auth/realms/REALM-NAME/protocol/openid-connect/token",
userinfo_endpoint: "https://keycloak-url:PORT/auth/realms/REALM-NAME/protocol/openid-connect/userinfo",
jwks_uri: "https://keycloak-url:PORT/auth/realms/REALM-NAME/protocol/openid-connect/certs",
name: "SOME-PROVIDER-NAME",
identifier: "CLIENT-ID-FROM-KEYCLOAK",
scopes_supported: ["SCOPES-FROM-KEYCLOAK"],
secret: "SECRET-FROM-KEYCLOAK"}

为了避免客户端证书验证(建议在生产环境中这样做),请将以下行添加到./app/models/provider.rb中(例如第23f行)。
  OpenIDConnect.http_client.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_NONE
  OpenIDConnect.http_client.ssl_config.set_client_cert_file('WEBRICK-CERTIFICATE-FILE','WEBRICK-CERTIFICATE-KEY-FILE')

同时,关于keycloak的json响应还存在一个问题,所以我添加了一些不太友好的检查方式(请勿评判我这样做的方式,只是为了开发目的),以确定响应是否为数组。

def decode_id(id_token)
  if config.jwks.to_s.chars.first == '['
    OpenIDConnect::ResponseObject::IdToken.decode id_token, config.jwks.first
  else
    OpenIDConnect::ResponseObject::IdToken.decode id_token, config.jwks
  end
end

请将./app/models/provider.rb中的decode_id方法替换掉。
假设您已经在keycloak上设置了帐户和请求客户端的client-id和secret,则应该可以从keycloak获取access-token。
祝好,tingel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接