- OpenIDの拡張で
- OAuthの認可済みのrequest tokenを
- もらう
- そうするとrequest tokenが返ってくるのでaccess tokenと交換します
- 通常のOAuthのフローだとここでrequest token secretが必要ですが、空文字列でOKです
- perlでいうと
- extensionを設定して認証要求
my $openid_csr = Net::OpenID::Consumer->new(...);
my $cident = $openid_csr->claimed_identity('http://www.google.com/accounts/o8/id');
$cident->set_extension_args(
'http://specs.openid.net/extensions/oauth/1.0', {
consumer => 'ayaya.dyndns.org',
scope => 'http://www.google.com/calendar/feeds',
}
);
my $redirect_url = $cident->check_url(...);
- 応答を検証してrequest tokenを取り出し、access tokenと交換
if (my $vident = $openid_csr->verified_identity) {
my $oauth_ext = $vident->signed_extension_fields('http://specs.openid.net/extensions/oauth/1.0');
my $request_token = $oauth_ext->{'request_token'};
my $oauth_csr = OAuth::Lite::Consumer->new(...);
$oauth_csr->request_token(OAuth::Lite::Token->new(token => $request_token));
my $access_token = $oauth_csr->get_access_token;
}
- はまったところ
- Google Calendar APIsにアクセスすると、gsessionidとかいう謎なパラメータがついたURLを302で返されるのだが、OAuth::Liteがsignatureを作り直してくれない
$oauth_csr->{ua}->requests_redirectable([]);
my $res = $oauth_csr->request(
method => 'GET',
url => 'http://www.google.com/calendar/feeds/default/allcalendars/full',
);
if ($res->code == HTTP::Status::RC_FOUND) {
my $uri = URI->new($res->header('Location'));
$res = $oauth_csr->request(
method => 'GET',
url => $uri->scheme . '://' . $uri->authority . $uri->path,
params => {$uri->query_form},
);
}