여러 매개 변수가있는 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. URL을 안전하게 만들기 위해 base64UrlEncode 수행->

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

다음은 base64UrlEncoding 및 디코딩의 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 it, json_decode하면 데이터가 있습니다.

여기에서 Google OAuth 2에 대해 자세히 알아보세요.

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


base64는 모호함을 통해 약간의 추가 '보안'이 필요한 경우 데이터를 난독 화하고 URL 인코딩하는 데 사용됩니다.
ricosrealm 2013 년

@DhruvPathak 완벽합니다. 링크드 인 API 리디렉션을 사용하여 맞춤 매개 변수를 다시 보내야했으며 설명했던 것과 동일한 방법입니다.
ericsicons

5
state 매개 변수는 OAuth 흐름 중에 CSRF 공격을 방지하는 데 사용됩니다. 흐름을 시작할 때 state 매개 변수에 토큰을 설정해야하며 redirect_uri가 적중 될 때 state 매개 변수에서 동일한 토큰이 반환되는지 확인해야합니다. 이 답변에서 수행되는 작업을 수행하지 마십시오. 세션 기반 솔루션은 아마도 당신이 봐야 할 것입니다.
라힘

2
stateparam을 사용 하여 여러 매개 변수를 전달하여 uri를 리디렉션 하고 동시에CSRF 공격 을 방지 하려면 어떻게해야합니까?
hellboy

1
@hellboy 나도 똑같은 궁금해. 상태 매개 변수에 여러 매개 변수를 추가 할 수 CSRF있었습니까 (사용자 지정 값 및 공격 방지 )?
Kevin Etore

4

.NET에있는 경우 세션에 매개 변수를 저장할 수 있습니다.

HttpContext.Current.Session[{varname}]

매개 변수없이 인증 페이지로 리디렉션

Response.Redirect(your_uri_approved_with_no_querystring_parameters);

4
azure와 같은 웹팜을 사용할 때는 확장되지 않습니다.
지출 자

3
@spender : 따라서 동일한 클라이언트에서 거의 순차적으로 두 개의 요청이 웹팜의 다른 서버에서 처리 될 수 있음을 암시합니다. 이 경우 영향을받는 유일한 것은 아닙니다. 기본적으로 세션 변수는 해당 시나리오에서 어떤 용도로도 사용할 수 없습니다. BTW : 저는 논쟁이 아닙니다. 실제로 여기서 배우려고합니다.
rufo

6
전적으로 가능합니다. 예 ... 세션 서버로 세션을 관리하거나 세션을 데이터베이스로 백업 ( msdn.microsoft.com/en-us/library/ms178586.aspx 참조 )하거나 고정 세션을 활성화 하여이 문제를 완화 할 수 있습니다. 로드 밸런서에서 클라이언트가 항상 동일한 웹 서버 노드로 돌아가도록합니다. 내가 언급 한 모든 옵션은 설정할 PITA이므로 IMO에 클라이언트 상태를 저장하는 Session것은 피해야합니다.
지출 자 2014-01-31

2

아래와 같이 url로 매개 변수를 리디렉션 할 수 있습니다.

url로 매개 변수를 전달할 수있는 것보다 Google에서 응답을 받으면

아래의 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 코드로 전송되는 곳입니다. 서버 측에서 세 가지 요청이 있습니다. 즉, 최종 요청에는 쿼리 문자열 변수가 전혀 포함되지 않습니다.
lol

매력처럼 작동합니다! 상태 매개 변수에 정보를 보낼 수 있다는 것을 알고 있지만 애플리케이션이 요청 매개 변수로 직접 값을 기대하면 실패합니다. 제공 한 방법은이 시나리오에 적합합니다. 감사!
Jayant Varshney
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.