使用 GitHub 作为 OAuth 2.0 认证提供商
- Tier: 免费版、高级版、旗舰版
- Offering: GitLab 自托管
您可以将 GitLab 实例与 GitHub.com 和 GitHub Enterprise 集成。 您可以从 GitHub 导入项目,或使用您的 GitHub 凭据登录 GitLab。
在 GitHub 中创建 OAuth 应用
要启用 GitHub OmniAuth 提供商,您需要从 GitHub 获取 OAuth 2.0 客户端 ID 和客户端密钥:
- 登录 GitHub。
- 创建 OAuth 应用
并提供以下信息:
- 您的 GitLab 实例 URL,例如
https://gitlab.example.com。 - 授权回调 URL,例如
https://gitlab.example.com/users/auth。 如果您的 GitLab 实例使用非默认端口,请包含端口号。
- 您的 GitLab 实例 URL,例如
检查安全漏洞
对于某些集成,OAuth 2 隐式重定向
漏洞可能会危及 GitLab 账户。
要缓解此漏洞,请在授权回调 URL 后面附加 /users/auth。
但是,据我们所知,GitHub 不会验证 redirect_uri 的子域名部分。
因此,您网站任何子域上的子域名接管、XSS 或开放重定向都可能启用隐式重定向攻击。
在 GitLab 中启用 GitHub OAuth
-
配置通用设置 以添加
github作为单点登录提供商。这将为没有现有 GitLab 账户的用户启用即时 账户预配。 -
使用以下信息编辑 GitLab 配置文件:
GitHub 设置 GitLab 配置文件中的值 描述 Client ID YOUR_APP_IDOAuth 2.0 客户端 ID Client secret YOUR_APP_SECRETOAuth 2.0 客户端密钥 URL https://github.example.com/GitHub 部署 URL -
对于 Linux 包安装:
-
打开
/etc/gitlab/gitlab.rb文件。对于 GitHub.com,更新以下部分:
gitlab_rails['omniauth_providers'] = [ { name: "github", # label: "Provider name", # 可选登录按钮标签,默认为 "GitHub" app_id: "YOUR_APP_ID", app_secret: "YOUR_APP_SECRET", args: { scope: "user:email" } } ]对于 GitHub Enterprise,更新以下部分并将
https://github.example.com/替换为您的 GitHub URL:gitlab_rails['omniauth_providers'] = [ { name: "github", # label: "Provider name", # 可选登录按钮标签,默认为 "GitHub" app_id: "YOUR_APP_ID", app_secret: "YOUR_APP_SECRET", url: "https://github.example.com/", args: { scope: "user:email" } } ] -
保存文件并重新配置 GitLab。
-
-
对于自编译安装:
-
打开
config/gitlab.yml文件。对于 GitHub.com,更新以下部分:
- { name: 'github', # label: 'Provider name', # 可选登录按钮标签,默认为 "GitHub" app_id: 'YOUR_APP_ID', app_secret: 'YOUR_APP_SECRET', args: { scope: 'user:email' } }对于 GitHub Enterprise,更新以下部分并将
https://github.example.com/替换为您的 GitHub URL:- { name: 'github', # label: 'Provider name', # 可选登录按钮标签,默认为 "GitHub" app_id: 'YOUR_APP_ID', app_secret: 'YOUR_APP_SECRET', url: "https://github.example.com/", args: { scope: 'user:email' } } -
保存文件并重启 GitLab。
-
-
-
刷新 GitLab 登录页面。登录表单下方应显示 GitHub 图标。
-
选择该图标。登录 GitHub 并授权 GitLab 应用。
故障排除
使用自签名证书从 GitHub Enterprise 导入失败
当您使用自签名证书从 GitHub Enterprise 导入项目时,导入会失败。
要解决此问题,您必须禁用 SSL 验证:
-
在配置文件中将
verify_ssl设置为false。-
对于 Linux 包安装:
gitlab_rails['omniauth_providers'] = [ { name: "github", # label: "Provider name", # 可选登录按钮标签,默认为 "GitHub" app_id: "YOUR_APP_ID", app_secret: "YOUR_APP_SECRET", url: "https://github.example.com/", verify_ssl: false, args: { scope: "user:email" } } ] -
对于自编译安装:
- { name: 'github', # label: 'Provider name', # 可选登录按钮标签,默认为 "GitHub" app_id: 'YOUR_APP_ID', app_secret: 'YOUR_APP_SECRET', url: "https://github.example.com/", verify_ssl: false, args: { scope: 'user:email' } }
-
-
在 GitLab 服务器上将全局 Git
sslVerify选项更改为false。-
对于运行 GitLab 15.3 及更高版本的 Linux 包安装:
gitaly['gitconfig'] = [ {key: "http.sslVerify", value: "false"}, ] -
对于运行 GitLab 15.2 及更早版本的 Linux 包安装(传统方法):
omnibus_gitconfig['system'] = { "http" => ["sslVerify = false"] } -
对于运行 GitLab 15.3 及更高版本的自编译安装,编辑 Gitaly 配置 (
gitaly.toml):[[git.config]] key = "http.sslVerify" value = "false" -
对于运行 GitLab 15.2 及更早版本的自编译安装(传统方法):
git config --global http.sslVerify false
-
-
如果您使用 Linux 包安装,请重新配置 GitLab; 如果您自行编译安装,请重启 GitLab。
使用 GitHub Enterprise 登录返回 500 错误
此错误可能是因为您的 GitLab 实例与 GitHub Enterprise 之间的网络连接问题。
要检查连接问题:
-
转到 GitLab 服务器上的
production.log并查找以下错误:Faraday::ConnectionFailed (execution expired) -
启动 rails 控制台 并运行以下命令。将
<github_url>替换为您的 GitHub Enterprise 实例 URL:uri = URI.parse("https://<github_url>") # 在此处将 `GitHub-URL` 替换为真实的 URL http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true http.verify_mode = 1 response = http.request(Net::HTTP::Get.new(uri.request_uri)) -
如果返回类似的
execution expired错误,这证实了该错误是由连接问题引起的。 确保 GitLab 服务器可以访问您的 GitHub Enterprise 实例。
使用 GitHub 账户登录但没有预先存在的 GitLab 账户不被允许
当您登录 GitLab 时,会收到以下错误:
使用您的 GitHub 账户登录而没有预先存在的
GitLab 账户是不允许的。请先创建 GitLab 账户,
然后将其连接到您的 GitHub 账户要解决此问题,您必须在 GitLab 中激活 GitHub 登录:
- 在左侧边栏中,选择您的头像。
- 选择 编辑个人资料。
- 在左侧边栏中,选择 账户。
- 在 服务登录 部分,选择 连接到 GitHub。