google oauth2 redirect_uri con varios parámetros

120

¿Cómo agregar parámetros a google oauth2 redirect_uri?

Así redirect_uri=http://www.example.com/redirect.html?a=b.

El bde a=bes aleatorio.

¿Alguien puede ayudar?

eason
fuente

Respuestas:

235
  1. No puede agregar nada al uri de redireccionamiento, el uri de redireccionamiento es constante según lo establecido en la configuración de la aplicación de Oauth. por ejemplo: http://www.example.com/redirect.html

  2. Para pasar varios parámetros a su uri de redireccionamiento, state guárdelos en el parámetro antes de llamar a la url de Oauth, la url después de la autorización enviará los mismos parámetros a su uri de redireccionamiento como state=THE_STATE_PARAMETERS

Entonces, para tu caso, haz esto:

/ 1. crea una cadena json de tus parámetros ->

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

/ 2. hacer un base64UrlEncode, para que sea una URL segura ->

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

Este es un ejemplo de 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, '-_,', '+/='));
}

Entonces ahora el estado sería algo como: stateString -> asawerwerwfgsg,

Pase este estado en la URL de autorización de 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 el flujo del lado del servidor, vendrá junto con el token: http://www.example.com/redirect.html?token=sdfwerwqerqwer&state=asdafwswdwefwsdg ,

Para el flujo del lado del cliente, vendrá en el hash junto con el token de acceso: http://www.example.com/redirect.html#access_token=portyefghsdfgdfgsdgd&state=asdafwswdwefwsdg ,

Recupere el estado, base64UrlDecode, json_decode y tendrá sus datos.

Obtenga más información sobre Google OAuth 2 aquí:

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

DhruvPathak
fuente
base64 se usa para ofuscar los datos, así como para codificarlos en la URL, si necesita un poco de 'seguridad' adicional a través de la oscuridad.
ricosrealm
@DhruvPathak perfecto, necesitaba enviar un parámetro personalizado con el redireccionamiento de la API de linkedin y es el mismo método que describiste.
ericsicons
5
El parámetro de estado se utiliza para prevenir ataques CSRF durante el flujo de OAuth. Debe establecer un token en el parámetro de estado al iniciar el flujo y debe verificar si obtiene el mismo token en el parámetro de estado cuando se activa su redirect_uri. No haga lo que se hace en esta respuesta. Una solución basada en sesiones es probablemente lo que debería buscar.
Rahim
2
¿Cómo puedo usar stateparam para pasar varios parámetros para redirigir uri y prevenir CSRFataques al mismo tiempo ?
hellboy
1
@hellboy me pregunto lo mismo. ¿Consiguió agregar varios parámetros al parámetro de estado (valores personalizados y prevenir CSRFataques)?
Kevin Etore
4

Si está en .NET puede guardar los parámetros en la sesión

HttpContext.Current.Session[{varname}]

y redirigir a la página de autorización sin parámetros

Response.Redirect(your_uri_approved_with_no_querystring_parameters);
rufo
fuente
4
Esto no se escala cuando se usa una granja web como azure.
gastador
3
@spender: por lo que implica que dos solicitudes casi en secuencia del mismo cliente pueden ser manejadas por diferentes servidores en la webfarm. Si ese es el caso, esto no es lo único afectado, básicamente, la variable de sesión no se puede usar en ese escenario para nada. Por cierto: no estoy discutiendo, en realidad estoy tratando de aprender aquí.
rufo
6
Es completamente posible, sí ... Puede mitigar esto administrando la sesión con un servidor de sesión o haciendo una copia de seguridad de la sesión en la base de datos (consulte msdn.microsoft.com/en-us/library/ms178586.aspx ), o habilitando sesiones fijas en su equilibrador de carga para garantizar que los clientes siempre regresen al mismo nodo del servidor web. Todas las opciones que he mencionado son un PITA para configurar, por lo que, en mi opinión, se Sessiondebe evitar almacenar cualquier estado del cliente .
gastador
2

Puede redirigir el parámetro con URL como se muestra a continuación,

Cuando recibe una respuesta de Google, puede pasar el parámetro con URL,

Consulte el código php a continuación para lo mismo,

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

}

En el ejemplo anterior, r = page / view es el parámetro en el que quiero la respuesta con el parámetro

Kiran
fuente
Aquí es donde se envía el parámetro de estado en el código PHP proporcionado por Google. Hay tres solicitudes realizadas en el lado del servidor. Esto significa que la solicitud final no tendrá ninguna variable de cadena de consulta.
lol
¡Funciona de maravilla! Sé que podemos enviar información en el parámetro de estado, pero si la aplicación espera algún valor directamente como parámetro de solicitud, falla. El método que ha proporcionado es perfecto para este escenario. ¡Gracias!
Jayant Varshney