【问题标题】:How to obtain GitLab Personal Access Token from command line如何从命令行获取 GitLab 个人访问令牌
【发布时间】:2018-05-05 12:03:50
【问题描述】:

是否有可能通过命令行而不是 Web 界面获取 Gitlab API 的个人访问令牌?我正在进行一些集成测试,Gitlab 部署到干净的环境中是测试会话设置的一部分。部署后测试用户正在使用Gitlab API 做一些工作。为了访问 API,测试用户需要提供 Personal Access Token。

我设法转储流量,我看到在呈现的 HTML 模板中提供了令牌以响应 POST 请求:

00:06:40.616996 IP6 localhost.amanda > localhost.53808: Flags [P.], seq 1:580, ack 1054, win 497, options [nop,nop,TS val 3133641719 ecr 3133641673], length 579
`..U.c.@................................'`.0...y.eIz.....k.....
........HTTP/1.1 302 Found
Server: nginx
Date: Tue, 21 Nov 2017 21:06:40 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 119
Connection: keep-alive
Cache-Control: no-cache
Location: http://localhost:10080/profile/personal_access_tokens
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-Request-Id: 88178813-95ad-419a-b56b-5a5ddb183885
X-Runtime: 0.044209
X-Ua-Compatible: IE=edge
X-Xss-Protection: 1; mode=block
X-Accel-Buffering: no

内心深处的回应:

<input type="text" name="created-personal-access-token" id="created-personal-access-token" value="j1WZujuaKVVEkh8h8Fej" readonly="readonly" class="form-control js-select-on-focus" aria-describedby="created-personal-access-token-help-block" />

但是,POST HTML 表单然后解析生成的 HTML 以获取令牌似乎太脏了。任何人都可以分享如何正确操作的秘密吗?

【问题讨论】:

    标签: gitlab access-token


    【解决方案1】:

    基于 HTML 解析的解决方法:https://github.com/vitalyisaev2/gitlab_token

    【讨论】:

      【解决方案2】:

      如果您可以控制 Docker 容器的部署方式,则将此文件保存在本地:

      # Inspired by https://gitlab.com/gitlab-org/gitlab/-/blob/master/db/fixtures/development/25_api_personal_access_token.rb
      # frozen_string_literal: true
      
      puts "=======================================".color(:red)
      puts "---------------------------------------".color(:red)
      puts "Creating api access token for root user".color(:red)
      puts "---------------------------------------".color(:red)
      puts "=======================================".color(:red)
      
      token = PersonalAccessToken.new
      token.user_id = User.find_by(username: 'root').id
      token.name = 'api-token-for-testing'
      token.scopes = ["api"]
      token.set_token('ypCa3Dzb23o5nvsixwPA')
      token.save
      
      print 'OK'
      

      并修改您的 docker-compose.yml 以包含

              image: gitlab/gitlab-ee
              volumes:
                - ./25_api_personal_access_token.rb:/opt/gitlab/embedded/service/gitlab-rails/ee/db/fixtures/production/25_api_personal_access_token.rb
      

      这对我有用。初始化 GitLab 容器后,我可以看到登录页面,我继续使用 Python 库导入我的测试数据并针对正在运行的 GitLab 实例运行一堆集成测试。

      注 1: 我在上面使用 GitLab EE,但您可以探索 /opt/gitlab/embedded/service/gitlab-rails/ 以获取更多 fixtures 目录并将此初始化放在其他地方。

      注2: 来自 gitlab 存储库的原始文件对我不起作用 b/c 它被设计用于开发模式,require 对我来说失败了。此外,token_digest 是硬编码的,不会与 GitLab 生成的盐匹配!

      【讨论】:

        【解决方案3】:

        也很脏,但是在 10.2 中,api/v4/session 命令消失了,因此通过基本身份验证登录是不可能的。如果您需要它进行集成测试并且可以通过 ssh 访问创建的 gitlab 实例,您可以直接通过 SQL 插入令牌,令牌似乎不是经过散列或加密的,而是纯文本。

        【讨论】:

        • 我试图在 SQL 中重新创建一个令牌,但它看起来只对特定的 Gitlab 实例有效。如果我从头开始创建另一个,它将变得无效。我怀疑 /etc/gitlab/gitlab-secrets.json 也有一个链接,用于盐或其他东西......顺便说一句,如果您尝试添加 SQL,请不要忘记更新相应的序列。即:SELECT pg_catalog.setval('public.personal_access_tokens_id_seq', 1, true);
        • 我需要用于集成测试的令牌值,并且我可以访问运行 Gitlab 的容器。知道如何在数据库中查询令牌吗?
        猜你喜欢
        • 2020-08-08
        • 2022-10-15
        • 1970-01-01
        • 1970-01-01
        • 2019-09-09
        • 1970-01-01
        • 2012-09-16
        • 2013-03-30
        • 2021-11-10
        相关资源
        最近更新 更多