作为 Single Sign On 提供者 (SSO Provider)

version: 2.5.0

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

本文是介绍如何将 Homeland 作为主的账号系统,三方应用通过 Homeland 来实现 SSO 同步账号登陆。

参数信息

配置启用 SSO Provider

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

配置项解释需要重启?
sso.enable_providertrue 启用 SSO Provider
sso.secretsso_secret,三方应用接入 Homeland SSO 登陆需要统一此 sso_secret,请确保两边一致,并注意保密

准备

在实现之前你可以先阅读一下 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 上面也是有效的。

演示例子

假定现在有个 Blog,需要基于 Homeland 的账号体系实现 SSO 登陆

  1. class ApplicationController < ActionController::Base
  2. # 验证是否已经登陆,为登陆跳转到 Homeland 的 SSO 地址
  3. def require_sso!
  4. if !session[:user]
  5. sso = SingleSignOn.new
  6. sso.return_sso_url = 'http://your-blog-app.com/sso_login'
  7. sso.sso_url = "http://your-homeland-app.com/auth/sso/provider"
  8. sso.sso_secret = 'YOUR_HOMELAND_SSO_SECRET'
  9. redirect_to sso.to_url
  10. end
  11. end
  12. end
  13. class BlogController < ApplicationController
  14. before_action :require_sso!
  15. # GET /blog
  16. def index
  17. end
  18. # GET /blog/new
  19. def new
  20. end
  21. end
  22. class SessionsController < ActionController::Base
  23. # GET /sso_login
  24. def sso_login
  25. sso = SingleSignOn.parse(request.query_string, 'YOUR_HOMELAND_SSO_SECRET')
  26. user = User.new
  27. user.username = sso.username
  28. user.email = sso.email
  29. user.name = sso.name
  30. user.avatar_url = sso.avatar_url
  31. user.bio = sso.bio
  32. session[:user] = user
  33. # 根据需要选择是否实现关联账号,并将 Homeland 传过来的用户信息存入数据库
  34. redirect_to '/blog/new'
  35. end
  36. end