/ gitlab

Gitlab使用omniauth自定义第三方登录方式

公司原本使用gitolite搭建的git仓库,gitolite本身的配置、员工的公钥都是通过一个git仓库来管理的。但随着公司发展,经常有人需要修改公钥,经常有一些小项目需要单独开一个仓库,每次都需要通过我这边操作配置,比较麻烦,因此我决定改用gitlab作为git仓库服务端。gitlab允许成员自己添加公钥,创建自己的项目,可以较好的满足目前的需求。

=以上是废话==

公司内部有一个单点登录系统(SSO),我希望gitlab也能集成这个SSO系统的登录,这样新入职的员工就不需要管理员手动添加帐号。

通过查阅gitlab的文档,发现gitlab本身集成了omniauth,这是一套集成第三方登录的通用框架,只要编写简单的代码就能集成一个第三方登录。

gitlab的web端是基于rails开发的,对于ruby和rails我都不是很熟悉,只能一点点尝试。

首先找到omniauth的开发文档,在文档的末尾提到一个项目可以用来比较方便的调试omniauth的strategy。

但这个项目的readme里只说了如何调试一个已经发布的gem,并没有说开发中的应该如何操作。(我TM都开发并发布好了还需要你这个项目干啥??)

另外就是clone好这个项目后,需要先在根目录创建一个db目录,不然会报错。

搜索了一下,发现有篇文章介绍了在没有打包成gem的情况下如何开发调试omniauth的strategy。

最终开发好的代码如下:

require 'omniauth' module OmniAuth module Strategies class SSO ApiUrl = 'xxxx.com' include OmniAuth::Strategy args [:appId, :secret] option :appId, nil option :secret, nil def request_phase redirect build_authorize_url(ApiUrl + '/login/', {:callback => callback_url, :appId => options[:appId].to_s}) end def callback_phase ticket = request.params["ticket"] res = post(ApiUrl + '/api/user', {:code => ticket}) @raw_info = res[:data]['data'] super end uid do @raw_info['uid'] end info do {:email => @raw_info['name'] + "@xxx.com"} end protected def post(url, params) #请求逻辑略 end end end end

这里有几个要注意的地方

  1. request_phase里的callback变量是omniauth自己添加的,我们不需要关心
  2. callback_phase里面的最后一句必须是super,不然rails会报错。
  3. uid返回的必须是全局唯一的字符串,可以用来唯一确定一个用户
  4. info中必须要有email字段(这个是gitlab的要求)

开发完成之后需要加入到gitlab里,由于是内部项目不能打包成gem发布,所以只能用刚刚那篇文章里的方法,在gitlab的config/initializers/devise.rb中加入一段代码,用来指明加载路径。

module OmniAuth module Strategies autoload :SSO, Rails.root.join('lib', 'omniauth', 'strategies', 'sso') end end OmniAuth.config.add_camelization "sso", "SSO"

然后就是配置gitlab来启用omniauth登录,参照这篇文档,如果是通过套装安装的gitlab,则编辑/etc/gitlab/gitlab.rb,源码安装编辑config/gitlab.yml。omniauth_enabled设置为true,启用omniauth功能;omniauth_allow_single_sign_on如果为true则当用户在gitlab中没有帐号时候会自动创建;block_auto_created_users如果为true则代表通过单点登录自动创建的用户默认是被禁用的,需要管理员解禁才可使用。

最后配置sso,如果是在gitlab.rb则在omniauth_providers的数组下面加入

{ "name" => "sso", "app_id" => "xxx", "app_secret" => "xxxxx" }

否则加入

  • {"name":"sso","app_id":"xx","app_secret":"xxxxxx"}

然后重启gitlab即可,执行gitlab-ctl reconfigure。

如果是通过docker安装的gitlab,并且使用官方镜像,则还有一个地方需要修改,需要将容器中/etc/pam.d/sshd文件的

session    required     pam_loginuid.so

注释掉,否则通过ssh协议clone仓库时会报错。

Gitlab使用omniauth自定义第三方登录方式
Share this