将 GitHub 作为 OAuth 2.0 认证提供商

您可以将极狐GitLab 实例与 GitHub.com 和 GitHub Enterprise 集成。这种集成使用户能够从 GitHub 导入项目,或使用他们的 GitHub 账户登录到您的极狐GitLab 实例。

在 GitHub 中创建 OAuth app

如要启用 GitHub OmniAuth 提供商,您需要一个 GitHub OAuth 2.0 客户端 ID 和客户端密钥:

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

安全漏洞检查

某些集成可能会危及极狐GitLab 账户。为了帮助缓解此 OAuth 2 隐蔽重定向漏洞,请将 /users/auth 附加到授权回调 URL 的末尾。

但是,GitHub 似乎并没有验证 redirect_uri 的子域部分。这意味着您网站的任何子域上的子域接管、XSS 或开放重定向都可能启用隐蔽重定向攻击。

在极狐GitLab 上启用 GitHub OAuth

  1. 配置通用设置github 添加为单点登录提供商。这为没有现有极狐GitLab 账户的用户启用了即时账户配置功能。
  2. 编辑极狐GitLab 配置文件并使用如下信息:

    在 GitHub 设置 在极狐GitLab 配置文件中替换 描述
    Client ID YOUR_APP_ID OAuth 2 客户端 ID
    Client Secret YOUR_APP_SECRET OAuth 2 客户端 Secret
    URL https://github.example.com/ GitHub 部署 URL
    • 针对 Linux 软件包安装实例:

      1. 打开 /etc/gitlab/gitlab.rb 文件。

        如针对 GitHub.com,更新如下部分:

        gitlab_rails['omniauth_providers'] = [
          {
            name: "github",
            # label: "Provider name", # optional label for login button, defaults to "GitHub"
            app_id: "YOUR_APP_ID",
            app_secret: "YOUR_APP_SECRET",
            args: { scope: "user:email" }
          }
        ]
        

        如针对 GitHub 企业版,更新如下部分并将 https://github.example.com/ 替换为您的 GitHub URL:

        gitlab_rails['omniauth_providers'] = [
          {
            name: "github",
            # label: "Provider name", # optional label for login button, defaults to "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', # optional label for login button, defaults to "GitHub"
            app_id: 'YOUR_APP_ID',
            app_secret: 'YOUR_APP_SECRET',
            args: { scope: 'user:email' } }
        

        如针对 GitHub 企业版,更新如下部分并将 https://github.example.com/ 替换为您的 GitHub URL:

        - { name: 'github',
            # label: 'Provider name', # optional label for login button, defaults to "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 验证。

要修复此问题,您必须禁用 SSL 验证:

  1. 在配置文件中将 verify_ssl 设置为 false

    • 针对 Linux 软件包安装实例:

      gitlab_rails['omniauth_providers'] = [
        {
          name: "github",
          # label: "Provider name", # optional label for login button, defaults to "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', # optional label for login button, defaults to "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

    • 对 15.3 及以后的 Linux 软件包安装的实例上运行:

      gitaly['gitconfig'] = [
         {key: "http.sslVerify", value: "false"},
      ]
      
    • 对 15.2 及以前的 Linux 软件包安装实例上运行:

      omnibus_gitconfig['system'] = { "http" => ["sslVerify = false"] }
      
    • 对使用源代码安装且版本在 15.3 及以后的实例, 编辑 Gitaly 配置 (gitaly.toml):

      [[git.config]]
      key = "http.sslVerify"
      value = "false"
      
    • 对使用源代码安装且版本在 15.2 及以前的实例上运行:

      git config --global http.sslVerify false
      
  3. 如果您使用 Linux 软件包安装实例,则重新配置极狐GitLab,如果您使用的是源代码安装,则重启极狐GitLab

尝试通过 GitHub Enterprise 登录极狐GitLab 时出现 Error 500

当您的极狐GitLab 实例和 GitHub Enterprise 之间出现网络链接问题时就会遇到此问题。

要想测试链接问题:

  1. 在您的极狐GitLab 服务器上找到 production.log 并查看如下错误信息:

    Faraday::ConnectionFailed (execution expired)
    
  2. 启动 rails 控制台并运行如下命令。用您的 GitHub Enterprise URL 替换 <github_url>

    uri = URI.parse("https://<github_url>") # replace `GitHub-URL` with the real one here
    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 实例。

不允许在没有预先存在的极狐GitLab 账户的情况下使用您的 GitHub 账户登录

如果登录时出现如下错误信息:

Signing in using your GitHub account without a pre-existing
GitLab account is not allowed. Create a GitLab account first,
and then connect it to your GitHub account
  1. 在右上角,选择您的头像。
  2. 选择 编辑个人资料
  3. 在左侧边栏中,选择 账户
  4. 服务登录 部分,选择 连接到 GitHub