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の場合はこんな感じ:
- 以下にブラウザからアクセス:(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
- ブラウザに表示された最終的なURLのうち、「code=」以下の部分をコピペしておく
- 以下の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】
- 返ってきたjsonに「refresh_token」がある
という感じで、なんとかPicasaへのアクセスを取り戻した。問題は、これがPhotosへのつなぎとして短命に終わるのか、終わるとすればいつか、来るべきPhotosのAPIで同等のことができるかだよなぁ。なにせいまですらGoogleのAPI一覧に名前がないんだから……。
どうしてもうまくいかずご教授ください。
2までは問題なく動くのですが3で「"error" : "invalid_request"」と
帰ってきてしまいます。
3で渡すパラメータは全てURLエンコードして貼り付けてるのですが
今現在も使えてますでしょうか?
あー、メッセージが不親切ですよねー。わかります。
わりと手前のフェーズでおかしな指定をしてもあとのフェーズでエラーになったりするので、まずは成功している事例をしっかり真似してみるのがいいと思います。
少なくとも自分でエンコードとかするとどこに問題があるのか切り分けられないので、上の記事中でリンクしたQiitaの記事のとおりに(使用するツールも含めて)なぞってみるといいのでは。
返事遅くなりましてすみません。
その後バッチリ動くようになりました。大変たすかりました。
ありがとうございます!