いくつかのパラメーターを指定したgoogle oauth2 redirect_uri


120

google oauth2 redirect_uriにパラメーターを追加する方法は?

このようにredirect_uri=http://www.example.com/redirect.html?a=b

bのはa=bランダムです。

誰でも手伝ってくれる?

回答:


235
  1. リダイレクトuriには何も追加できません。リダイレクトuriは、Oauthのアプリ設定で設定された定数です。例:http : //www.example.com/redirect.html

  2. リダイレクトURIにいくつかのパラメーターを渡すにstate は、Oauth URLを呼び出す前にそれらをパラメーターに格納します。承認後のURLは、リダイレクトURIに同じパラメーターを送信します。 state=THE_STATE_PARAMETERS

したがって、あなたのケースでは、これを行います:

/ 1。パラメータのjson文字列を作成します->

{ "a" : "b" , "c" : 1 }

/ 2。base64UrlEncodeを実行して、URLを安全にします->

stateString = base64UrlEncode('{ "a" : "b" , "c" : 1 }');

これは、base64UrlEncoding&encodingのPHPの例です(http://en.wikipedia.org/wiki/Base64#URL_applications):

function base64UrlEncode($inputStr)
{
    return strtr(base64_encode($inputStr), '+/=', '-_,');
}

function base64UrlDecode($inputStr)
{
    return base64_decode(strtr($inputStr, '-_,', '+/='));
}

したがって、状態は次のようになります。stateString-> asawerwerwfgsg、

この状態をOAuth認証URLで渡します。

https://accounts.google.com/o/oauth2/auth?
  client_id=21302922996.apps.googleusercontent.com&
  redirect_uri=https://www.example.com/back&
  scope=https://www.google.com/m8/feeds/&
  response_type=token&
  state=asdafwswdwefwsdg,

サーバーサイドフローの場合、トークンと一緒に送信されます:http : //www.example.com/redirect.html? token = sdfwerwqerqwer&state =asdafwswdwefwsdg

クライアントサイドフローの場合、アクセストークンとともにハッシュに含まれます。http : //www.example.com/redirect.html#access_token=portyefghsdfgdfgsdgd&state=asdafwswdwefwsdg

状態を取得し、base64UrlDecode、json_decodeを実行すると、データが得られます。

Google OAuth 2の詳細については、次をご覧ください。

http://code.google.com/apis/accounts/docs/OAuth2.html


base64は、データを難読化するために使用されます。また、あいまいさによる追加の「セキュリティ」が少し必要な場合は、URLエンコードします。
ricosrealm 2013年

@DhruvPathak完璧です。リンクされたAPIリダイレクトでカスタムパラメータを送り返す必要があり、それはあなたが説明した方法と同じです。
ericsicons 2015年

5
状態パラメーターは、OAuthフロー中のCSRF攻撃を防ぐために使用されます。フローを開始するときに、stateパラメーターにトークンを設定する必要があります。redirect_uriがヒットしたときに、stateパラメーターに同じトークンが返されるかどうかを確認する必要があります。この回答で行われていることを行わないでください。セッションベースのソリューションはおそらくあなたが見るべきものです。
ラヒム2017

2
stateparam を使用して、 uriをリダイレクトし、同時にCSRF攻撃を防ぐためにいくつかのパラメーターを渡すにはどうすればよいですか?
hellboy 2017

1
@hellboy私は同じことを考えています。状態パラメーターにいくつかのパラメーターを追加することに成功しましたか(カスタム値とCSRF攻撃の防止)
ケビンエトール

4

.NETを使用している場合は、セッションにパラメータを保存できます

HttpContext.Current.Session[{varname}]

パラメータなしで認証ページにリダイレクトします

Response.Redirect(your_uri_approved_with_no_querystring_parameters);

4
AzureなどのWebファームを使用する場合、これはスケーリングしません。
14年

3
@spender:つまり、同じクライアントからのほぼ連続した2つの要求が、Webファーム内の異なるサーバーによって処理される可能性があることを意味します。その場合、影響を受けるのはこれだけではありません。基本的に、Session変数はそのシナリオでは何にも使用できません。ところで:私は議論していません-実際にここで学ぼうとしています。
rufo 2014年

6
それは完全に可能です、はい...セッションサーバーとのセッションを管理するか、データベースへのセッションをバックオフする(msdn.microsoft.com/en-us/library/ms178586.aspxを参照)か、スティッキーセッションを有効にすることで、これを軽減できます。ロードバランサーで、クライアントが常に同じWebサーバーノードに戻るようにします。これまでに説明したすべてのオプションは、設定するPITAであるため、IMOでクライアントの状態を保存するSessionことは避けてください。
2014年

2

あなたは以下のようにURLでパラメータをリダイレクトすることができます、

googleから応答を受け取ったとき、URLでパラメーターを渡すことができますが、

以下のphpコードを参照してください、

if (isset($_GET['code'])) {
   $client->authenticate();
   $_SESSION['token'] = $client->getAccessToken();
   $redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
   header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL) . '?r=page/view');

}

上記の例では、r = page / viewはパラメーターで応答が必要なパラメーターです


これは、Google提供のPHPコードで状態パラメーターが送信される場所です。サーバー側で行われる3つの要求があります。つまり、最後のリクエストにはクエリ文字列変数がまったくありません。

魅力のように動作します!状態パラメーターで情報を送信できることはわかっていますが、アプリケーションが要求パラメーターとして値を直接期待している場合、失敗します。指定した方法は、このシナリオに最適です。ありがとう!
Jayant Varshney
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.