Я пытаюсь написать скрипт, который должен войти на наш сервер GitLab (соответствующая часть, похоже, является приложением rails, и я бы очень не хотел его менять). Для этого я написал скрипт (на Perl, но здесь это не имеет большого значения), который выполняет HTTP GET в направлении /users/sign_in
и анализирует результат, чтобы получить authenticity_token
, использованный как (насколько я знаю). по крайней мере, понятно) Защита CSRF, а затем выполняет HTTP PUT в направлении /users/sign_in
со всеми (?) переменными формы, которые я вижу в HTML.
Но в результате я получаю «422 Unprocessable Entity», и в /var/log/gitlab/gitlab-rails/production.log
я вижу
Started POST "/users/sign_in" for 46.30.211.31 at 2019-04-04 13:39:09 +0000
Processing by SessionsController#create as HTML
Parameters: {"utf8"=>"â\u009C\u0093", "authenticity_token"=>"[FILTERED]", "user"=>{"login"=>"abcdef", "remember_me"=>"0", "password"=>"[FILTERED]"}}
Can't verify CSRF token authenticity.
Completed 422 Unprocessable Entity in 10ms (ActiveRecord: 1.4ms | Elasticsearch: 0.0ms)
ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):
lib/gitlab/middleware/multipart.rb:103:in `call'
lib/gitlab/request_profiler/middleware.rb:16:in `call'
ee/lib/gitlab/jira/middleware.rb:17:in `call'
lib/gitlab/middleware/go.rb:20:in `call'
lib/gitlab/etag_caching/middleware.rb:13:in `call'
lib/gitlab/middleware/correlation_id.rb:16:in `block in call'
lib/gitlab/correlation_id.rb:15:in `use_id'
lib/gitlab/middleware/correlation_id.rb:15:in `call'
lib/gitlab/middleware/read_only/controller.rb:42:in `call'
lib/gitlab/middleware/read_only.rb:18:in `call'
lib/gitlab/middleware/basic_health_check.rb:25:in `call'
lib/gitlab/request_context.rb:26:in `call'
lib/gitlab/metrics/requests_rack_middleware.rb:29:in `call'
lib/gitlab/middleware/release_env.rb:13:in `call'
(Нет, пользователь, которому я должен войти в систему, поскольку, когда я заставляю это работать, не называется "abcdef", но когда в моем скрипте было настоящее имя пользователя, GitLab заблокировал учетную запись из-за неудачных входов в систему и замены это ничего не изменило)
Что я могу делать не так?
В случае, если мой код поможет:
#! /usr/bin/perl
use strict;
use warnings;
use LWP::UserAgent;
my $username = 'abcdef';
my $password = 'sekr!t';
my $base_url = 'https://gitlab.one.com/';
my $signin_url = $base_url.'users/sign_in';
my $ua = LWP::UserAgent->new();
$ua->ssl_opts(verify_hostname => 0, SSL_verify_mode => 0x00);
my $response = $ua->get($signin_url);
unless ($response->is_success) {
die "Error getting $signin_url: ".$response->status_line;
}
my $content = $response->decoded_content;
my $c = 0;
my $authenticity_token = '';
LINE: for my $line (split /\n/,$content) {
if ($line =~ m/<input type="hidden" name="authenticity_token" value="([^"]+)" \/>/) {
$authenticity_token = $1;
print "Authenticity_token is: $authenticity_token ?\n";
# There are two lines containing an authentiticity token, take he first
last LINE;
}
}
my $data = {
'authenticity_token' => $authenticity_token,
'utf8' => '✓',
'user[login]' => $username,
'user[password]' => $password,
'user[remember_me]' => 0,
};
my %headers = (
'Host' => 'gitlab.one.com',
'X-CSRF-Token' => $authenticity_token,
);
$response = $ua->post($signin_url, $data, %headers);
unless ($response->is_success) {
die "Error getting $signin_url: ".$response->status_line;
}
$content = $response->decoded_content;
for my $line (split /\n/, $content) {
print $line;
}