OpenID OAuth Extension について今北産業に答える

  1. OpenIDの拡張で
  2. OAuthの認可済みのrequest tokenを
  3. もらう
  • そうするとrequest tokenが返ってくるのでaccess tokenと交換します
    • 通常のOAuthのフローだとここでrequest token secretが必要ですが、空文字列でOKです
  • ただそれだけ、あとは普通のOAuthと同じ
  • 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},
    );
}