読者です 読者をやめる 読者になる 読者になる

OAuth2.0対応サービスのstate, redirect_uriパラメータの扱い色々

OAuth

この前行われたidconで、OAuth2対応サービスのstateパラメータとredirect_uriパラメータの扱いってどうなってる?という話題があったのと、以前途中まで調べたものがあったので、いい機会なのでまとめてみました。

stateパラメータとredirect_uriパラメータについて

まずstateパラメータとredirect_uriパラメータについてです。が、ちょうどstateパラメータとredirect_uriパラメータについて書かれたエントリがありましたので、そちらをどうぞ!

利用する側としては、もしstateパラメータが利用できなければredirect_uriにquery parameterでnonceなどを渡してstateパラメータの代わりにしたいところです。

調べたこと

今回はstateパラメータとredirect_uriパラメータの扱いについて、下記の5つのサービスを調べました。

Facebook

Facebookはstateパラメータが使用可能です。 redirect_uriに指定するURLは、下記の範囲内であればquery parameterを付加したりパスを変えたりできます。

https://developers.facebook.com/docs/authentication/server-side/

For security, the redirect_uri must have the same base domain as that specified in the App Domain property of your app's settings, or be a URL of the form https://apps.facebook.com/YOUR_APP_NAMESPACE.

mixi

mixiもstateパラメータをサポートしています。 mixiではredirect_uriは事前に登録する必要があり、また、authorization request時にredirect_uriを指定せず、登録したURLにリダイレクトするという仕様なので、リクエストごとに異なるquery parameterをつけるようなことはできません。

Google

Googleもstateパラメータは使用できることがちゃんとドキュメントに書いてあります。

https://developers.google.com/accounts/docs/OAuth2WebServer

Indicates the Google API access your application is requesting. The values passed in this parameter inform the consent page shown to the user. There is an inverse relationship between the number of permissions requested and the likelihood of obtaining user consent.

redirect_urlはauthorization request時に指定できますが、redirect_uriはclient idに対して登録されたものの内どれか1つにマッチするものでないといけません。

Instagram

stateパラメータ使えます。

http://instagram.com/developer/authentication/

Note: You may provide an optional state parameter to carry through any server-specific state you need to, for example, protect against CSRF issues.

redirect_uriは、query parameterが許されるパターンが明記されています。詳細に書いてあるというわけではないんですが、簡潔な説明で結構わかりやすいです。

foursquare

OAuth関連のドキュメントには書いていなかったのですが、試したところstateパラメータが使えました。 また、redirect_uriパラメータについては、これもドキュメントに書かれているわけではないですが、登録したredirect_uriにquery parameter加えてを指定することができました。(登録したredirect_uriの下位パスの指定を無視しているようです。前方一致?) 一応、チュートリアルにはstateパラメータを使ったサンプルがあったので、ドキュメントには使えるパラメータを明記しておいてほしいなーと思います。

まとめ

stateパラメータとredirect_uriパラメータの扱いは結構気になる部分だったのですが、個人的には意外とstateパラメータがサポートされているなーという感じでした。ありがたいですね。また、redirect_uriの扱いはサービスごとにかなり違うようです。

あ、stateパラメータが使える場合はちゃんとstateパラメータ使いましょう。redirect_uriでどうにかするのはあくまで次善の策だと思います。

参考