トップ 最新

ただのにっき

2015-05-29(金) [長年日記]

Picasa APIの認証をパスワードからOAuthに変更した

massrの写真投稿機能では主にPicasaプラグインを使っているのだけど、昨日あたりから急にうまく動かなくなり、エラーメッセージをみてみると「パスワード認証使えなくなったぜ」みたいなページに飛ばされた。なるほど、もうずいぶん前からOAuthに移行しろって言ってたもんね、見てみぬふりしてたけど、ついにそのときが来たか。

奇しくも開催中のGoogle I/OではGoogle+から写真ライブラリ機能を分離したGoogle Photosが容量無制限を謳って華々しくデビュー。Picasaも吸収されちゃうんだろうと思うけど、Google PhotosはまだAPIを公開していないっぽいので、PicasaのAPIはまだしばらく現役だろう。

というわけで、Googleが提供するOAuth2.0への移行を始めたのだが、これがなかなか、うまくいかない。ちなみにこれまでパスワード認証で使っていたpicasa gemがOAuthに対応していることはドキュメントで確認済み。問題はこれに指定するアクセストークンの取得方法だ。Using OAuth 2.0 to Access Google APIsを読むと、今回のようにユーザとのインタラクションなしにAPIを使いたい場合はservice accountを使うようなのだけど、これで生成したアクセストークンを使ってもパーミッションがないと言われるのである。同じことをしている記事も見つからないしなー。

うんうん悩んでいたところ救世主が降臨。ようするにservice accountを使うのが間違いで、普通にWeb server applicationsのアカウントを作って、いったんブラウザで対話式に認証を済ましてから、そこで得られたrefresh tokenを使ってアクセストークンを得る、という流れ。ちょっと複雑になったが、ようするにOAuth1.0と同じようなステップを踏むのが正解ということか。やれやれ。

refresh token取得の流れはgoogleapi - Google API OAuth2.0のアクセストークン&リフレッシュトークン取得手順メモ - Qiitaが参考になる。Picasaの場合はこんな感じ:

  1. 以下にブラウザからアクセス:(redirect urlは実在しなくても良い)
    https://accounts.google.com/o/oauth2/auth?client_id=【client id】&redirect_uri=【redirect url】&scope=https://picasaweb.google.com/data/&response_type=code&approval_prompt=force&access_type=offline
  2. ブラウザに表示された最終的なURLのうち、「code=」以下の部分をコピペしておく
  3. 以下のURLに対して:
    https://accounts.google.com/o/oauth2/token
    下記のデータをPOSTする。先のリンク先ではcurlを使う例がある:
    client_id=【client id】&client_secret=【client secret】&redirect_uri=【redirect url】&grant_type=authorization_code&code=【上で取得したcode】
  4. 返ってきたjsonに「refresh_token」がある

という感じで、なんとかPicasaへのアクセスを取り戻した。問題は、これがPhotosへのつなぎとして短命に終わるのか、終わるとすればいつか、来るべきPhotosのAPIで同等のことができるかだよなぁ。なにせいまですらGoogleのAPI一覧に名前がないんだから……。