Works by

Ren's blog

@rennnosuke_rk 技術ブログです

【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認証におけるリダイレクト

GoogleFacebookTwitterOAuth認証APIを利用して各SNSで認可を行う際、自身が管理するアプリのサーバにリダイレクトさせて認証状況を確認したい場合があります。

このとき、各SNSOAuth認証APIを叩く前にリダイレクトしてもらうURLを設定します。

# リダイレクトURL
# APIサーバが提供するパスなど
https://hoge.net/oauth/callout/google

もし、リダイレクト前の状態をリダイレクト先に渡したい場合、
リクエストパラメータをクエリストリングに追加したい・・・等考えると思いますが、一部のSNSはリダイレクトURLにパラメータを直接指定すると404を返してきます。

# NG(404が返る)
https://hoge.net/oauth/callout/google?param=hoge

f:id:rennnosukesann:20180511140026p:plain

どうやら、リダイレクト先にパラメータを渡すためにはちょっとした工夫が必要なようです。

リダイレクト先にパラメータを渡す方法: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に対する認証リクエストを投げるのに便利です。

github.com

リダイレクト先にパラメータを渡す方法: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にパラメータが挿入されません。
GoogleFacebookと異なるので注意したいところです。

参考

stackoverflow.com

stackoverflow.com

stackoverflow.com