通过三方应用实现 SSO 登录

version: 2.5.0

Homeland 支持 Single Sign On,可以让你将 Homeland 无缝的和现有应用结合,实现统一登录的功能。

本文是介绍如何让 Homeland 通过三方应用实现 SSO 自动登录。

在你准备使用 Homeland 的时候,你可能已有一个网站,有自己的用户体系,例如:一个新闻网站。如果你希望 Homeland 自动通过这个新闻网站的账号体系来实现登录,你需要跟随下面的教程调整你的现有网站,以实现 Homeland SSO 功能的接入。

NOTE: 本文涉及需要給原有应用编写代码的部分,需技术人员,部分演示代码采用 Ruby 语言编写,其他语言可作为参考。

准备

在实现之前你可以先阅读一下 Homeland SSO 接口的实现代码:

ruby-china/homeland/blob/master/lib/single_sign_on.rb

  1. class SingleSignOn
  2. ACCESSORS = [:nonce, :name, :username, :email, :avatar_url, :bio, :external_id, :return_sso_url, :admin]
  3. FIXNUMS = []
  4. BOOLS = [:admin]
  5. NONCE_EXPIRY_TIME = 10.minutes
  6. attr_accessor(*ACCESSORS)
  7. attr_accessor :sso_secret, :sso_url
  8. def self.parse(payload, sso_secret = nil)
  9. sso = new
  10. sso.sso_secret = sso_secret if sso_secret
  11. ... 省略
  12. end

请参考此文件实现一个 SingleSignOn 类,如果是 Ruby 你可以直接复制来使用。

NOTE: SingleSignOn 类是参考 Discourse 实现的,所以理论上来说 Discourse 支持哪些 SSO 登陆方式,在 Homeland 上面也是有效的。

在你的主应用中提供一个 (sso.url) 类似这样的 http://your-app.com/homeland/sso 的接口,并实现类似下面的代码:

  1. class HomelandSsoController < ApplicationController
  2. def sso
  3. # sso_secret 需要和 Homeland 里面配置的 sso_secret 一致
  4. secret = "MY_SSO_SECRET_STRING"
  5. sso = SingleSignOn.parse(request.query_string, secret)
  6. # 以下的信息将会提供给 Homeland 作为用户信息同步
  7. sso.email = "user@email.com"
  8. sso.name = "Bill Hicks"
  9. sso.username = "bill@hicks.com"
  10. sso.bio = "This is bio of this user"
  11. sso.external_id = "123" # unique id for each user of your application
  12. sso.sso_secret = secret
  13. # 最后将准备好的信息计算成加密的 URL Query String 并跳转到 Homeland 应用的 SSO 登录地址 '/auth/sso/login'
  14. # Homeland 接收到信息以后,将会实现同步账号登陆的流程
  15. redirect_to sso.to_url("http://your-homeland-app.com/auth/sso/login")
  16. end
  17. end

配置 Homeland

请参阅 Homeland 配置文档,并增加下面这些配置:

配置项解释需要重启?
sso.enabletrue 启用 SSO 登陆,请确保 enable_provider 为 false,否则将无效
sso.url主应用的 SSO 登陆地址
sso.secret主应用提供的 sso_secret,请确保两边一致,并注意保密

各类语言关于 SingleSignOn 的实现参考

其他参考链接