Help us learn about your current experience with the documentation. Take the survey.

使用 GitHub 作为 OAuth 2.0 认证提供商

  • Tier: 免费版、高级版、旗舰版
  • Offering: GitLab 自托管

您可以将 GitLab 实例与 GitHub.com 和 GitHub Enterprise 集成。 您可以从 GitHub 导入项目,或使用您的 GitHub 凭据登录 GitLab。

在 GitHub 中创建 OAuth 应用

要启用 GitHub OmniAuth 提供商,您需要从 GitHub 获取 OAuth 2.0 客户端 ID 和客户端密钥:

  1. 登录 GitHub。
  2. 创建 OAuth 应用 并提供以下信息:
    • 您的 GitLab 实例 URL,例如 https://gitlab.example.com
    • 授权回调 URL,例如 https://gitlab.example.com/users/auth。 如果您的 GitLab 实例使用非默认端口,请包含端口号。

检查安全漏洞

对于某些集成,OAuth 2 隐式重定向 漏洞可能会危及 GitLab 账户。 要缓解此漏洞,请在授权回调 URL 后面附加 /users/auth

但是,据我们所知,GitHub 不会验证 redirect_uri 的子域名部分。 因此,您网站任何子域上的子域名接管、XSS 或开放重定向都可能启用隐式重定向攻击。

在 GitLab 中启用 GitHub OAuth

  1. 配置通用设置 以添加 github 作为单点登录提供商。这将为没有现有 GitLab 账户的用户启用即时 账户预配。

  2. 使用以下信息编辑 GitLab 配置文件:

    GitHub 设置 GitLab 配置文件中的值 描述
    Client ID YOUR_APP_ID OAuth 2.0 客户端 ID
    Client secret YOUR_APP_SECRET OAuth 2.0 客户端密钥
    URL https://github.example.com/ GitHub 部署 URL
    • 对于 Linux 包安装:

      1. 打开 /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" }
          }
        ]
      2. 保存文件并重新配置 GitLab。

    • 对于自编译安装:

      1. 打开 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' } }
      2. 保存文件并重启 GitLab。

  3. 刷新 GitLab 登录页面。登录表单下方应显示 GitHub 图标。

  4. 选择该图标。登录 GitHub 并授权 GitLab 应用。

故障排除

使用自签名证书从 GitHub Enterprise 导入失败

当您使用自签名证书从 GitHub Enterprise 导入项目时,导入会失败。

要解决此问题,您必须禁用 SSL 验证:

  1. 在配置文件中将 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' } }
  2. 在 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
  3. 如果您使用 Linux 包安装,请重新配置 GitLab; 如果您自行编译安装,请重启 GitLab

使用 GitHub Enterprise 登录返回 500 错误

此错误可能是因为您的 GitLab 实例与 GitHub Enterprise 之间的网络连接问题。

要检查连接问题:

  1. 转到 GitLab 服务器上的 production.log 并查找以下错误:

    Faraday::ConnectionFailed (execution expired)
  2. 启动 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))
  3. 如果返回类似的 execution expired 错误,这证实了该错误是由连接问题引起的。 确保 GitLab 服务器可以访问您的 GitHub Enterprise 实例。

使用 GitHub 账户登录但没有预先存在的 GitLab 账户不被允许

当您登录 GitLab 时,会收到以下错误:

使用您的 GitHub 账户登录而没有预先存在的
GitLab 账户是不允许的。请先创建 GitLab 账户,
然后将其连接到您的 GitHub 账户

要解决此问题,您必须在 GitLab 中激活 GitHub 登录:

  1. 在左侧边栏中,选择您的头像。
  2. 选择 编辑个人资料
  3. 在左侧边栏中,选择 账户
  4. 服务登录 部分,选择 连接到 GitHub