Gitlab集成odoo单点登录

1.Gitlab使用oauth2单点登录的背景

OAuth代表资源所有者向客户端应用程序提供对服务器资源的“安全委派访问”。实际上,OAuth允许授权服务器在资源所有者或最终用户的批准下向第三方客户端颁发访问令牌。

OAuth主要用作单一登录服务(SSO),但是您可以找到此功能的许多不同用途。例如,您可以允许用户使用其GitLab.com帐户登录到您的应用程序,或者可以使用GitLab.com对您的GitLab实例进行身份验证(请参阅GitLab OmniAuth)。

“ GitLab导入程序”功能还使用OAuth协议来访问存储库,而无需将用户凭据共享到您的GitLab.com帐户。

GitLab支持两种将新OAuth2应用程序添加到实例的方法。您可以将应用程序添加为普通用户,也可以将其添加到管理区域中。这意味着GitLab实际上可以具有实例范围的应用程序和用户范围的应用程序。除了设置的不同权限级别(用户/管理员)外,它们之间没有区别。默认的回调URL是 http://your-gitlab.example.com/users/auth/gitlab/callback

2. Gitlab已经集成的oauth供应商

  • GitHub
  • Bitbucket
  • GitLab.com
  • Google
  • Facebook
  • Twitter
  • Shibboleth
  • SAML
  • Crowd
  • Azure
  • Auth0
  • Authentiq
  • OAuth2Generic
  • JWT
  • OpenID Connect
  • Salesforce
  • AWS Cognito

各大供应商对Gitlab的集成方式不一样,使用的oauth策略也有所不同,值得注意的是OAuth2Generic这个策略,它是一个通用的策略,在用户需要自定义第三方的供应商的时候可以使用OAuth2Generic该策略。具体配置如下

编辑gitlab.rb

打开配置文件:对于源安装

/etc/gitlab/gitlab.rb

增加Oauth配置:

gitlab_rails['omniauth_enabled'] = true
gitlab_rails['omniauth_allow_single_sign_on'] = ['oauth2_generic']
gitlab_rails['omniauth_block_auto_created_users'] = false
gitlab_rails['omniauth_providers'] = [{'name' => 'oauth2_generic','app_id' => 'YOUR_APP_ID','app_secret' => 'YOUR_APP_KEY','args' => {client_options: {'site' => 'YOUR_SERVER_IP','authorize_url'=>'/oauth2/authorize','token_url'=>'/oauth2/token','user_info_url' => '/oauth2/userInfo'},user_response_structure: {root_path: [], # i.e. if attributes are returned in JsonAPI format (in a 'user' node nested under a 'data' node)attributes: { name: 'username', nickname: 'nickName'} # if the nickname attribute of a user is called 'username'},name: 'Name', # display name for this strategystrategy_class: "OmniAuth::Strategies::OAuth2Generic" # Devise-specific config option Gitlab uses to find renamed strategy}}
]

配置文件修改完成后,重设配置:

gitlab-ctl reconfigure

OAuth2Generic策略已经为我们提供好了集成Gitlab的所有条件,第三方提供商只需要提供 oauth2/authorize,授权接口,这将要求用户根据中指定的范围批准应用程序对其帐户的访问REQUESTED_SCOPES,然后重定向回REDIRECT_URI您提供的帐户。该范围参数 是要访问(如示波器的空格隔开列表,scope=read_user+profile 会要求read_userprofile范围)。重定向将包含GET code参数

然后会根据返回的code GItlab会去调用/oauth2/token接口,第三方供应商需要提供返回token的接口,响应数据:

{"access_token": "de6780bc506a0446309bd9362820ba8aed28aa506c71eedbe1c5c4f9dd350e54","token_type": "bearer","expires_in": 7200,"refresh_token": "8257e65c97202ed1726cf9571600918f3bffb2544b26e00a61df9897668c33a1"
}

接着,第三方供应商提供的接口返回tokenGitlab会根据返回的token解析地址,然后调用第三方供应商提供的/oauth2/userinfo接口获取相关的信息,完成登录验证或者注册

3. odoo集成Gitlab的单点登录实现

odoo提供了一个模块可以实现对所有openid集成以及oauth2的集成模块

具体参考:See add-on page on odoo.com

该模块已经为我们提供好了上述所说的接口,接下来只将该模块安装到odoo环境下,并生成具体的app_id &app_secret

并打开 /etc/gitlab/gitlab.rb 文件配置

示例:app_id:cezkeyxamjiwhmbg & app_secret : mKExoqnSInVr67x2zWLDPxdBvM0YpzTd& ip : 172.16.11.14

在gitlab.rb配置文件中配置 本次使用的是oauth2_generic策略

gitlab_rails['omniauth_enabled'] = true
gitlab_rails['omniauth_allow_single_sign_on'] = ['oauth2_generic']
gitlab_rails['omniauth_block_auto_created_users'] = false
gitlab_rails['omniauth_providers'] = [{'name' => 'oauth2_generic','app_id' => 'cezkeyxamjiwhmbg','app_secret' => 'mKExoqnSInVr67x2zWLDPxdBvM0YpzTd','args' => {client_options: {'site' => 'http://172.16.11.14','authorize_url'=>'/oauth2/authorize','token_url'=>'/oauth2/token','user_info_url' => '/oauth2/userInfo'},user_response_structure: {root_path: [], # i.e. if attributes are returned in JsonAPI format (in a 'user' node nested under a 'data' node)attributes: { name: 'username', nickname: 'nickName'} # if the nickname attribute of a user is called 'username'},name: 'Name', # display name for this strategystrategy_class: "OmniAuth::Strategies::OAuth2Generic" # Devise-specific config option Gitlab uses to find renamed strategy}}
]

**遗憾的是,**odoo提供的模块在使用oauth2_generic通用策略的时候并未能达到预想的效果,而是出现了错误,使得认证并未能成功,只能使用其他同源策略

OpenID Connect策略的尝试

Gitlab 还提供了openid 策略,庆幸的是odoo提供的供应商模块支持openid认证方式,尝试使用openid策略去尝试认证

详细的配置信息可参考:gitlab openid

具体配置如下:

打开配置文件:对于源安装

/etc/gitlab/gitlab.rb
gitlab_rails['omniauth_allow_single_sign_on'] =['openid_connect']
gitlab_rails['omniauth_providers'] = [{ 'name' => 'openid_connect','label' => 'odoo','args' => {'issuer' => '172.16.11.14','client_auth_method' => 'query',
#     'discovery' => true, 'send_nonce'=>false,'client_options' => {'identifier' => 'cezkeyxamjiwhmbg','secret' => 'mKExoqnSInVr67x2zWLDPxdBvM0YpzTd','scheme'=>'http','host'=>'172.16.11.14','port'=>'8069','authorization_endpoint'=>'/authorize','token_endpoint'=>'/token','userinfo_endpoint'=>'/userinfo','jwks_uri'=>'/jwks','redirect_uri' => 'http://172.16.11.100/users/auth/openid_connect/callback'}}}
]

值得注意的是 'discovery' => true, 该值默认为false如果该值为ture则如下配置全部失效:

     'scheme'=>'http','host'=>'172.16.11.14','port'=>'8069','authorization_endpoint'=>'/authorize','token_endpoint'=>'/token','userinfo_endpoint'=>'/userinfo','jwks_uri'=>'/jwks','redirect_uri' => 'http://172.16.11.100/users/auth/openid_connect/callback'

discoverytrue时Gitlab通过'issuer' => '172.16.11.14',来读取相应的认证地址和获取token,需要把issuer的值设置为https请求协议,它会根据所填写的地址去调用一个/.well-known/openid-configuration 接口 。

odoo的提供模块已经封装了该接口,可以直接使用,对于有安全证书的可以使用该策略方法。

本例中没有使用该方法,所以设置 'discovery' => false, 指定了该策略需要走的是哪个host和认证的所有接口

认证通过,用户可以使用odoo用户来进行Gitlab的登录以及注册

4.遇到的问题:

在odoo中,转跳url地址似乎只有重定向的方式,并不能携带参数以及post请求,没办法实现单点直接请求Gitlab开启认证流程,跳转页面还需要进行第二次输入账号密码过于麻烦

解决:

查阅Gitlab API文档,发现Gitlab已经考虑了该问题只需要在配置文件中添加gitlab_rails['omniauth_auto_sign_in_with_provider']并指向自己选择的策略即可实现当用户访问Gitlab首页时,自动使用该策略的登录认证方式:

gitlab_rails['omniauth_auto_sign_in_with_provider'] ='openid_connect'

请记住,每次登录尝试都将重定向到OmniAuth提供程序,因此您将无法使用本地凭据登录。确保至少一个OmniAuth用户具有管理员权限。

您也可以通过浏览到来绕过自动登录功能 https://gitlab.example.com/users/sign_in?auto_sign_in=false

这样做的好处在于你可以直接重定向到Gitlab首页,然后自动开始认证流程,不好的地方在于无法再本地登录,还需要设置登出时的请求地址确保注销掉odoo的登录信息,这样即可实现单点登录

**登出**请求地址如下:

http://172.16.11.14:8069/web/session/logout

最后效果

效果如下:

Gitlab集成odoo单点登录相关推荐

  1. JEECG 集成KiSSO单点登录实现统一身份认证

    JEECG 集成KiSSO单点登录实现统一身份认证 JEECG 如何为其他第三方系统实现统一身份认证服务,实现单点登录? 第三方系统如何对接呢? 今天为大家揭开这层面纱,让大家了解实质,使用它更快速的 ...

  2. springsecurity oauth2.0 集成sso单点登录

    前言 在前两篇中,我们基本上了解springsecurity 的授权码模式和密码模式的工作流程,其实来说,掌握了授权码模式,再基于springsecurity 做单点登录的集成就是一件非常容易的事情 ...

  3. 代码生成器更新:集成redis单点登录,支持SpringCloud生成

    文章目录 引言 界面展示 生成示例 效果演示 二次开发示例 结语 引言 最近得空更新了一版代码生成器,在原来的基础上做了些许优化,添加了 redis 单点登录的生成逻辑,除此之外,最主要的是添加了 S ...

  4. java单点登录统一认证,JEECG 集成KiSSO单点登录实现统一身份认证

    JEECG 集成KiSSO单点登录实现统一身份认证 JEECG 如何为其他第三方系统实现统一身份认证服务,实现单点登录? 第三方系统如何对接呢? 今天为大家揭开这层面纱,让大家了解实质,使用它更快速的 ...

  5. oauth最后的确认按钮_spring-oauth集成cas单点登录,登陆完成进入授权页面后,按回退按钮进入404页面的问题...

    背景: 1.项目中使用耶鲁的cas做单点登录. 2.使用spring-oauth包实现oauth2服务 3.使用spring-cas做spring-security及cas的集成 现象: 开发报了个b ...

  6. web工程中集成cas单点登录

    背景 cas的服务端已经搭建成功,现在需要在web项目中集成cas client.我们项目使用spring 1.在pom中配置 <!--cas单点登录 --><dependency& ...

  7. springboot集成CAS单点登录客户端

    1. springboot项目pom.xml中 添加cas客户端依赖包 <dependency><groupId>org.jasig.cas.client</groupI ...

  8. Exchange-OWA与域控集成-实现单点登录

    最近遇到客户,所有客户端是加了域环境的,以前03是用USB KEY输入PIN码直接就进去了,现在升级了Exchange 环境后,USB KEY证书有问题又不知怎么解决,就想实现机器直接打开OWA不用输 ...

  9. 集成CAS单点登录 决策系统的配置以及注意事项

    这里重点说CAS客户端的相关配置与写法. 先上原理图: 从上面可以看出,分为如下几个步骤: 1 当我们访问被保护的资源时,会被CAS客户端拦截到,并重定向到CAS服务端去登录,此时URL上通过serv ...

最新文章

  1. Angular开发实践(一):环境准备及框架搭建
  2. Android---------------Activity的学习
  3. java svn安装地址_SVN的安装和配置
  4. c/c++头文件函数一览表
  5. 绘制三维散点图_SPSS统计作图教程:三维散点图
  6. [JavaWeb-HTTP]HTTP概念
  7. java队列优先级_优先级队列-Java的PriorityQueue与最小堆有何不同?
  8. matlab读取xls、xlsx、csv文件
  9. javascript实现数组深复制的方法
  10. 开心开心开心开心开心开心哦哦哦
  11. 如何在sql存储过程中打log_教你如何记录Entity Framework框架自动生成的SQL语句
  12. Why Helm? - 每天5分钟玩转 Docker 容器技术(160)
  13. 什么是联表查询?(深度刨析,建议收藏)
  14. [转载] JAVA的throw用法及扩展
  15. 如何将安卓设备连接到Mac电脑上?
  16. PostGis+GeoServer+OpenLayers最短路径分析
  17. C语言 100道经典编程题适用于专升本,专接本【详细分析版】
  18. 自助建站平台实力比拼:凡科、微企点、建站之星、宝华建站、微魔方、上线了...
  19. 达梦安装与基本使用【进阶】
  20. 工具说明书 - FTDI芯片的USB转UART串口线

热门文章

  1. Delphi常用的Excel操作
  2. CF 1646D Weight the Tree 树形dp
  3. 华为鸿蒙概念机,华为Mate50Pro概念机,屏下镜头+一亿像素+麒麟9010,你喜欢吗?...
  4. 蓝牙简介 | bluetooth
  5. Weka package manager 出错的解决办法
  6. 关于语义分割预测出来的图片全黑的解决办法
  7. 极智AI | 全场景算力产品矩阵 看算能系列AI产品
  8. php下单声音提醒,拼多多商家怎么设置下单的声音?开启方法是什么?
  9. 用LU_ASR语音控制板和Arduinonano做一个桌面老婆(1)
  10. 5、基于51单片智能手环设计心率计蓝牙app计步器温湿度设计