google oauth2 redirect_uri com vários parâmetros

120

Como adicionar parâmetros ao google oauth2 redirect_uri?

Assim mesmo redirect_uri=http://www.example.com/redirect.html?a=b.

O bde a=bé aleatório.

Alguém pode ajudar?

eason
fonte

Respostas:

235
  1. Você não pode adicionar nada ao uri de redirecionamento, o uri de redirecionamento é constante, conforme definido nas configurações do aplicativo do Oauth. por exemplo: http://www.example.com/redirect.html

  2. Para passar vários parâmetros para seu uri de redirecionamento, state guarde -os em parâmetro antes de chamar o url Oauth, o url após a autorização enviará os mesmos parâmetros para o seu uri de redirecionamento como state=THE_STATE_PARAMETERS

Então, para o seu caso, faça o seguinte:

/ 1. crie uma string json de seus parâmetros ->

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

/ 2. faça um base64UrlEncode, para torná-lo um URL seguro ->

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

Este é um exemplo PHP de base64UrlEncoding & decoding ( http://en.wikipedia.org/wiki/Base64#URL_applications ):

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

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

Então agora o estado seria algo como: stateString -> asawerwerwfgsg,

Passe este estado no URL de autorização OAuth:

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,

Para o fluxo do lado do servidor, ele virá com o token: http://www.example.com/redirect.html?token=sdfwerwqerqwer&state=asdafwswdwefwsdg ,

Para o fluxo do lado do cliente, ele virá no hash junto com o token de acesso: http://www.example.com/redirect.html#access_token=portyefghsdfgdfgsdgd&state=asdafwswdwefwsdg ,

Recupere o estado, base64UrlDecode-o, json_decode-o e você terá seus dados.

Veja mais sobre o google OAuth 2 aqui:

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

DhruvPathak
fonte
base64 é usado para ofuscar os dados, bem como codificá-los por url, se você precisar de um pouco mais de 'segurança' na obscuridade.
ricosrealm
@DhruvPathak perfeito, eu precisava enviar um parâmetro personalizado de volta com o redirecionamento da API do LinkedIn e é o mesmo método que você descreveu.
ericsicons
5
O parâmetro de estado é usado para evitar ataques CSRF durante o fluxo OAuth. Você deve definir um token no parâmetro de estado ao iniciar o fluxo e deve verificar se obtém o mesmo token no parâmetro de estado quando seu redirect_uri é atingido. Não faça o que é feito nesta resposta. Uma solução baseada em sessão é provavelmente o que você deve procurar.
Rahim
2
Como posso usar stateparam para passar vários parâmetros para redirecionar uri e prevenir CSRFataques ao mesmo tempo ?
hellboy
1
@hellboy estou me perguntando a mesma coisa. Você conseguiu adicionar vários parâmetros ao parâmetro de estado (valores personalizados e prevenção de CSRFataques)?
Kevin Etore
4

Se você estiver no .NET, você pode salvar os parâmetros na sessão

HttpContext.Current.Session[{varname}]

e redirecionar para a página de autorização sem parâmetros

Response.Redirect(your_uri_approved_with_no_querystring_parameters);
Rufo
fonte
4
Isso não se ajusta ao usar uma webfarm como o azul.
spender
3
@spender: então você sugere que duas solicitações quase em sequência do mesmo cliente podem ser tratadas por servidores diferentes na webfarm. Se for esse o caso, essa não é a única coisa afetada; basicamente, a variável de sessão não poderia ser usada nesse cenário para nada. BTW: Eu não estou discutindo - na verdade, tentando aprender aqui.
rufo
6
É totalmente possível, sim ... Você pode atenuar isso gerenciando a sessão com um servidor de sessão ou fazendo backup da sessão para o banco de dados (consulte msdn.microsoft.com/en-us/library/ms178586.aspx ) ou para habilitar sessões persistentes em seu balanceador de carga para garantir que os clientes sempre retornem ao mesmo nó do servidor da web. Todas as opções que mencionei são um PITA para configurar, portanto, o armazenamento de qualquer estado do cliente Sessiondeve ser evitado.
spender
2

Você pode redirecionar o parâmetro com o url abaixo,

Quando você obtém uma resposta do google, pode passar o parâmetro com o url,

Veja abaixo o código php para o mesmo,

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');

}

No exemplo acima r = page / view é o parâmetro no qual eu quero a resposta com o parâmetro

Kiran
fonte
É para onde o parâmetro de estado é enviado no código PHP fornecido pelo Google. Existem três pedidos feitos do lado do servidor. Isso significa que a solicitação final não terá nenhuma variável de string de consulta.
lol
Funciona como um encanto! Sei que podemos enviar informações no parâmetro de estado, mas se o aplicativo estiver esperando qualquer valor diretamente como o parâmetro de solicitação, ele falhará. O método que você forneceu é perfeito para este cenário. Obrigado!
Jayant Varshney,