使用cURL登录Gitlab
为了针对Docker中的
Gitlab实例测试命令行工具,我想使用用户名和密码登录Gitlab并获取创建的会话以验证我的API请求.
因此我会做以下事情: >使用curl -i http:// localhost:8080 / users / sign_in -s卷曲用户登录页面 curl 'http://localhost:8080/users/sign_in' -H "_gitlab_session=${cookie}" -H 'Origin: http://localhost:8080' -H 'Content-Type: application/x-www-form-urlencoded' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8' -H 'Referer: http://localhost:8080/users/sign_in' -H 'Connection: keep-alive' --data-urlencode "authenticity_token=${token}" --data-urlencode "user[login]=root" --data-urlencode "user[password]=12341234" --data-urlencode "user[remember_me]=0" 但是,我获得了一个而不是有效的用户登录 422 - The change you requested was rejected. 在日志文件中,我看到了 ==> gitlab-rails/production.log <== Started POST "/users/sign_in" for 172.17.0.1 at 2017-12-23 00:22:16 +0000 Processing by SessionsController#create as HTML Parameters: {"authenticity_token"=>"[FILTERED]","user"=>{"login"=>"root","password"=>"[FILTERED]","remember_me"=>"0"}} Can't verify CSRF token authenticity Completed 422 Unprocessable Entity in 125ms (ActiveRecord: 7.8ms) ==> gitlab-rails/production_json.log <== {"method":"POST","path":"/users/sign_in","format":"html","controller":"SessionsController","action":"create","status":422,"error":" ActionController::InvalidAuthenticityToken:ActionController::InvalidAuthenticityToken","duration":126.29,"view":0.0,"db":7.78,"time":"2017-12-23T00:22:16.039Z","params":{"authenticity_token":"[FILTERED]","user":{"login":"root","password":" [FILTERED]","remember_me":"0"}},"remote_ip":"172.17.0.1","user_id":1,"username":"root"} ==> gitlab-rails/production.log <== ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken): lib/gitlab/middleware/multipart.rb:93:in `call' lib/gitlab/request_profiler/middleware.rb:14:in `call' lib/gitlab/middleware/go.rb:18:in `call' lib/gitlab/etag_caching/middleware.rb:11:in `call' lib/gitlab/middleware/read_only.rb:31:in `call' lib/gitlab/request_context.rb:18:in `call' lib/gitlab/metrics/requests_rack_middleware.rb:27:in `call' 我假设我忘了在第二次请求中传递必要的成分 – 但我无法弄清楚,哪一个. 解决方法
通过其他答案和评论的一些有用提示,我终于想出了这个解决方案:
gitlab_host="http://localhost:8080" gitlab_user="root" gitlab_password="12341234" # curl for the login page to get a session cookie and the sources with the auth tokens body_header=$(curl -c cookies.txt -i "${gitlab_host}/users/sign_in" -s) # grep the auth token for the user login for # not sure whether another token on the page will work,too - there are 3 of them csrf_token=$(echo $body_header | perl -ne 'print "$1n" if /new_user.*?authenticity_token"[[:blank:]]value="(.+?)"/' | sed -n 1p) # send login credentials with curl,using cookies and token from previous request curl -b cookies.txt -c cookies.txt -i "${gitlab_host}/users/sign_in" --data "user[login]=${gitlab_user}&user[password]=${gitlab_password}" --data-urlencode "authenticity_token=${csrf_token}" # send curl GET request to personal access token page to get auth token body_header=$(curl -H 'user-agent: curl' -b cookies.txt -i "${gitlab_host}/profile/personal_access_tokens" -s) csrf_token=$(echo $body_header | perl -ne 'print "$1n" if /authenticity_token"[[:blank:]]value="(.+?)"/' | sed -n 1p) # curl POST request to send the "generate personal access token form" # the response will be a redirect,so we have to follow using `-L` body_header=$(curl -L -b cookies.txt "${gitlab_host}/profile/personal_access_tokens" --data-urlencode "authenticity_token=${csrf_token}" --data 'personal_access_token[name]=golab-generated&personal_access_token[expires_at]=&personal_access_token[scopes][]=api') # Scrape the personal access token from the response HTML personal_access_token=$(echo $body_header | perl -ne 'print "$1n" if /created-personal-access-token"[[:blank:]]value="(.+?)"/' | sed -n 1p) 根据GitLab API documentation,您现在可以使用会话cookie来验证API请求: curl --header "Private-Token: ${personal_access_token}" https://gitlab.example.com/api/v4/projects 一些提示: >我首先对curl -c文件(从头文件读取cookie并将其写入文件)与curl -b文件(使用文件中的cookie并随请求发送)混淆 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |