2012-10-09 21 views
7

Mam aplikację RoR, w której uwierzytelniam się wobec Google za pomocą omniauth i google_oauth2, gdy żądam dostępu w trybie offline.Jak odświeżyć mój token dostępu google_oauth2 przy użyciu mojego tokena odświeżania?

Jak korzystać z mojego tokena odświeżania w celu zażądania dostępu do tokenu dostępu? Jak mogę odświeżyć swój token dostępu, gdy przestanie on działać? Nie chcę mieć żadnego interfejsu użytkownika w tej sytuacji, zakładając oczywiście, że autoryzacja nie została odebrana.

Odpowiedz

5

Nie widzę niczego w google_oauth2, które obsługuje pobieranie nowego access_token za pomocą odświeżającego tokena, więc wygląda na to, że musisz dokonać wymiany bezpośrednio.

Google's official OAuth 2.0 documentation wyjaśnia, jak to zrobić na niskim poziomie. W kodzie po stronie serwera, użyj swojego ulubionego klienta HTTP skonstruować wniosek, który wygląda tak:

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 

gdzie CLIENT_ID i CLIENT_SECRET są takie same te, które stosowane do pierwotnego uwierzytelniania i REFRESH_TOKEN jest token odświeżania z oryginalny przepływ uwierzytelniania. Jeżeli wymiana jest sukces, otrzymasz token dostępu świeżego w odpowiedzi, który wygląda mniej więcej tak:

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

Możesz śledzić ten proces, aby pobrać nowy żeton dostępu, gdy zajdzie taka potrzeba. Możesz użyć wartości expires_in, aby oszacować, kiedy będziesz potrzebować nowej, lub spróbować odświeżyć, gdy żądanie API odpowie na stan HTTP 401.

9

Na przykład używając gem Ruby HTTParty:

Gdzie @auth jest rekord ActiveRecord który przechowuje kluczy uwierzytelniających dla konkretnego użytkownika, które starają się odświeżyć znaki dla.

# 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

gdzie zaimplementujesz to w swojej aplikacji rails? na przykład Mam żądanie pobierania, aby pobrać kontakty użytkowników za pomocą httparty, który wysyła token, jak powiedziałbym po opublikowaniu tokena odświeżania, jeśli token wygasł? – Richlewis

+0

Kod, który napisałem powyżej, to kod, który wykonuje żądanie POST, aby odświeżyć token. Po wykonaniu żądania GET sprawdziłbym, czy kod odpowiedzi jest równy 401, czyli zazwyczaj kod, który otrzymasz, gdy chcesz odświeżyć token. Jeśli kod odpowiedzi HTTParty == 401 uruchomi mój kod (dostosowany do twoich potrzeb). – Blake

+0

świetnie, ale pracuję, dziękuję – Richlewis

Powiązane problemy