我是Mojolicious::Plugin::OAuth2的快乐用户,但有一个但是:我可以毫无问题地获得访问令牌,但我不知道如何获得刷新令牌。文档有点简洁,我在野外找不到示例。
目前我这样做:
plugin OAuth2 => {
providers => {
google => {
key => 'somekey',
secret => 'somesecret',
redirect => 'http://localhost:3000/login/google',
access_type => 'offline',
scope => join ' ', qw|some scopes|,
}
}
};
get '/' => sub {
my $c = shift;
$c->render(template => 'login');
};
get '/done' => sub {
my $c = shift;
$c->render(text => 'done: ' . $c->session('token'));
};
get '/login/google' => sub {
my $c = shift;
my $otx = $c->render_later->tx;
my $args = { redirect_uri => 'http://localhost:3000/login/google' };
$c->oauth2->get_token_p(google => $args)
->then(sub {
my $otx = $otx;
return unless my $res = shift;
$c->session(token => $res->{access_token});
1;
})
->then(sub {
my $tx = shift;
my $ua = $c->app->ua;
my $url = 'https://www.googleapis.com/userinfo/v2/me';
my $tx = $ua->build_tx(GET => $url);
$tx->req->headers->authorization('Bearer ' . $c->session('token'));
return $ua->start_p($tx);
})
->then(sub {
my $tx = shift;
my $otx = $otx;
my $data = $tx->res->json;
$c->app->log->info($tx->res->body);
$c->app->log->info(dumper $tx->res->json);
$c->redirect_to('/done');
})
->catch(sub {
my $err = shift;
$c->log->info($err);
$c->render(text => $err);
});
};
(很抱歉转储)这几乎是Mojolicious::Plugin::OAuth2的标准流程。
然而,据我所知,来自Google的响应不包含任何刷新令牌,我也不知道如何请求一个令牌--在中间的某个地方插入$c->oauth2->get_refresh_token_p($provider_name => \%args);
会给我一个糟糕的请求响应。
那么,我应该如何做才能让它正常工作呢?
1条答案
按热度按时间1sbrub3j1#
如果在创建OAuth2插件示例时设置了
access_type => 'offline'
(如您在示例中所做的那样),get_access_token_p()
将返回刷新标记(除了access_token
之外),如here所述。您应该将刷新令牌存储在安全的地方。然后您可以在以后使用它来刷新访问令牌(例如,如果api调用返回访问令牌过期错误)。在这种情况下,您可以使用已存储为参数的刷新令牌调用get_refresh_token_p()
。下面是一个例子: