【OAuth】Google/Facebook/TwitterのOAuth認証APIに設定するリダイレクトURLにパラメータを含める
Google/Facebook/Twitter のOAuth API
Using OAuth 2.0 to Access Google APIs | Google Identity Platform | Google Developers
ウェブ - Facebookログイン - ドキュメンテーション - 開発者向けFacebook
Oauth with the Twitter API — Twitter Developers
SNS認証におけるリダイレクト
GoogleやFacebook、TwitterのOAuth認証用APIを利用して各SNSで認可を行う際、自身が管理するアプリのサーバにリダイレクトさせて認証状況を確認したい場合があります。
このとき、各SNSのOAuth認証用APIを叩く前にリダイレクトしてもらうURLを設定します。
# リダイレクトURL # APIサーバが提供するパスなど https://hoge.net/oauth/callout/google
もし、リダイレクト前の状態をリダイレクト先に渡したい場合、
リクエストパラメータをクエリストリングに追加したい・・・等考えると思いますが、一部のSNSはリダイレクトURLにパラメータを直接指定すると404を返してきます。
# NG(404が返る) https://hoge.net/oauth/callout/google?param=hoge
どうやら、リダイレクト先にパラメータを渡すためにはちょっとした工夫が必要なようです。
リダイレクト先にパラメータを渡す方法:Google
GoogleのOAuthAPIのリダイレクトURLには、直接パラメータを指定することができません。
かわりに、認証サーバへのリクエストURLであるAuthorizationURLにパラメータstate
を介してパラメータを渡すことができます。
Javaで実装する場合こんな感じ。
ServiceBuilder builder = new ServiceBuilder() .apiKey(apiKey) .apiSecret(apiSecret) .scope(scope) .state(state) // リダイレクトURLに含めたいパラメータを指定可能(文字列) .callback(callback) // リダイレクトURL .build(GoogleApi20.instance());
上記コードではScriveJavaというJavaのOAuthクライアントライブラリを使用しています。
OAuthに対する認証リクエストを投げるのに便利です。
リダイレクト先にパラメータを渡す方法:Facebook
Facebookも同様に、AuthorizationURLのパラメータstate
を指定することでリダイレクトURLパラメータを挿入します。
ServiceBuilder builder = new ServiceBuilder() .apiKey(apiKey) .apiSecret(apiSecret) .scope(scope) .state(state) // リダイレクトURLに含めたいパラメータを指定可能(文字列) .callback(callback) // リダイレクトURL .build(FacebookApi.instance());
Googleと大差ありませんね。
リダイレクト先にパラメータを渡す方法:Twitter
一方で、TwitterはリダイレクトURLへのパラメータ指定を許しているみたいです。
# NG(404が返る) String callback = "https://hoge.net/oauth/callout/google?param=hoge"; ServiceBuilder builder = new ServiceBuilder() .apiKey(apiKey) .apiSecret(apiSecret) .scope(scope) .callback(callback) // リダイレクトURL .build(TwitterApi.Authenticate.instance());
逆に、state
にパラメータを設定してもリダイレクトURLにパラメータが挿入されません。
GoogleやFacebookと異なるので注意したいところです。