2012-10-09 45 views
7

Tengo una aplicación RoR donde me estoy autenticando contra Google usando omniauth y google_oauth2 donde solicito acceso sin conexión.¿Cómo actualizo mi token de acceso de google_oauth2 con mi token de actualización?

¿Cómo uso mi token de actualización para solicitar un token de acceso actual? Además, ¿cómo puedo actualizar mi token de acceso cuando ya no funciona? No quiero tener ninguna interfaz de usuario en esta situación, suponiendo, por supuesto, que la autorización no se haya retirado.

Respuesta

5

No veo nada en google_oauth2 que maneja la obtención de un nuevo access_token con un token de actualización, por lo que parece que tendrá que realizar el intercambio directamente.

Google's official OAuth 2.0 documentation explica cómo hacerlo a un nivel bajo. Dentro de su código del lado del servidor, use su cliente HTTP favorita para construir una solicitud que tiene este aspecto:

POST /o/oauth2/token HTTP/1.1 
Host: accounts.google.com 
Content-Type: application/x-www-form-urlencoded 

client_id=CLIENT_ID& 
client_secret=CLIENT_SECRET& 
refresh_token=REFRESH_TOKEN& 
grant_type=refresh_token 

donde CLIENT_ID y CLIENT_SECRET son los mismos que haya utilizado para la autenticación original y REFRESH_TOKEN es el token de actualización de la flujo de autenticación original. Si el intercambio se realiza correctamente, recibirá un token de acceso fresca en una respuesta que se ve algo como esto:

{ 
    "access_token":"1/fFBGRNJru1FQd44AzqT3Zg", 
    "expires_in":3920, 
    "token_type":"Bearer", 
} 

Usted puede seguir este proceso para tomar un nuevo token de acceso siempre que lo necesite. Puede usar el valor expires_in para estimar cuándo necesitará uno nuevo, o intentar una actualización siempre que su solicitud API responda con un estado HTTP 401.

9

Para un ejemplo usando la gema de rubíes HTTParty:

Dónde @auth es un registro de ActiveRecord que almacena las claves de autenticación para el usuario específico que está tratando de refrescar fichas para.

# Refresh auth token from google_oauth2 and then requeue the job. 
    options = { 
    body: { 
     client_id: <YOUR GOOGLE API CLIENT ID HERE>, 
     client_secret: <YOUR GOOGLE API SECRET KEY HERE>, 
     refresh_token: @auth.refresh_token, 
     grant_type: 'refresh_token' 
    }, 
    headers: { 
     'Content-Type' => 'application/x-www-form-urlencoded' 
    } 
    } 
    @response = HTTParty.post('https://accounts.google.com/o/oauth2/token', options) 
    if @response.code == 200 
    @auth.token = @response.parsed_response['access_token'] 
    @auth.expires_in = DateTime.now + @response.parsed_response['expires_in'].seconds 
    @auth.save   
    else 
    Rails.logger.error("Unable to refresh google_oauth2 authentication token.") 
    Rails.logger.error("Refresh token response body: #{@response.body}") 
    end 
+0

¿dónde implementarías esto en tu aplicación de rieles? por ejemplo, tengo una solicitud de obtención para recuperar los contactos de los usuarios usando httparty que envía el token, ¿cómo puedo decir publicar el token de actualización si el token ha caducado? – Richlewis

+0

El código que publiqué arriba es el código que hace la solicitud POST para actualizar el token. Después de realizar su solicitud GET, verificaría si el código de respuesta es igual a 401, que es típicamente el código que obtendrá cuando necesite actualizar su token. Si el código de respuesta de HTTParty == 401, ejecute mi código (ajustado para sus necesidades). – Blake

+0

excelente, tengo trabajo en la mina, gracias – Richlewis

Cuestiones relacionadas