2014-10-23 10 views
5

ich auf Skript arbeitete Google-Kontakte erhalten google contacts api gem verwenden. Ich kann den Token zuzugreifen erfolgreich mit diesem Code:-Token, speichern Sie es, es aktualisieren, wenn abgelaufen mit oauth2 Juwel in Ruby

require 'rubygems' 
require 'launchy' 
require 'oauth2' 
require 'googlecontacts' 
require 'google_contacts_api' 

# Get your credentials from the console 
CLIENT_ID = 'your Id' 
CLIENT_SECRET = 'your Secret' 
OAUTH_SCOPE = 'https://www.google.com/m8/feeds' 
REDIRECT_URI = 'urn:ietf:wg:oauth:2.0:oob' 

client = OAuth2::Client.new(CLIENT_ID, CLIENT_SECRET,site: 'https://accounts.google.com',token_url: '/o/oauth2/token', authorize_url: '/o/oauth2/auth') 
url = client.auth_code.authorize_url(scope: OAUTH_SCOPE, redirect_uri: REDIRECT_URI) 
Launchy.open(url) 
$stdout.write "Enter authorization code: " 
code = gets.chomp 
token = client.auth_code.get_token(code, :redirect_uri => REDIRECT_URI) 

PROBLEM:

Ich weiß, dass dies nicht der beste Weg ist, es zu tun, weil es anstrengend ist. Jedes Mal, wenn ich das Skript ausführe, hat der Benutzer Zugriffsanweisungen gegeben. Und ich muss auch manuell kopieren das Token vom Browser zum Terminal kopieren.

FRAGE:

Wie kann in der Lage sein, die abgerufene Token zu speichern, und wenn es abgelaufen, wie kann ich es aktualisieren?

Antwort

6

Es sieht so aus, als ob Sie das oauth2 library verwenden, um das Zugriffstoken zu erhalten. Die AccessToken class verfügt über to_hash() und from_hash() Methoden, die Sie verwenden können, um das Token zu serialisieren und zu deserialisieren, sobald Sie es erhalten haben, sowie eine refresh() Methode, um das Zugriffstoken zu aktualisieren, sobald es abgelaufen ist. Wenn dies ein Befehlszeilenskript ist, können Sie eine versteckte Datei im Ausgangsverzeichnis des Benutzers verwenden, um das serialisierte Token zu speichern.

+0

Was ich nicht verstehe, ist: "Was kann ich in den obigen Code hinzufügen, um einen Hash mit dem Zugriffstoken und dem Aktualisierungstoken zurückzugeben?". das ist das Problem. Ich meine, so etwas wie diese: { "access_token": "1/fFAGRNJru1FTz70BzhT3Zg", "expires_in": 3920, "token_type": "Bearer", "refresh_token": "1/xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI" } – ben

+1

Wenn Wenn Sie die Methode client.auth_code.get_token ausführen, wird die Antwort ein AccessToken-Objekt sein. Und wie Sie im [Quellcode] (https://github.com/intridea/oauth2/blob/master/lib/oauth2/access_token.rb) sehen können, hat diese Klasse alle gewünschten Informationen, wie 'token' , 'refresh_token', Ablaufinformationen und eine Methode zum Aktualisieren der Auth. –

+0

Ich habe einen Weg. Danke Rael & Eric für deine Antwort. Ich kann jetzt auf das Aktualisierungstoken zugreifen. Ich werde einen Weg finden, um es für den Austausch eines neuen Tokens zu verwenden, sobald es abläuft. – ben

3

Während die ersten Authentifizierung, haben Sie eine Autorisierungs-Token und eine Aktualisierungs-Token.

Speichern Sie das refresh_token (in der Sitzung, wenn es sich um eine Web-App oder ein anderes "flüchtiges" Persistenzschema oder in letzterem Fall um eine Datenbank handelt).

Mit dem refresh_token nach einem neuen Token fragen, wie in Google OAuth2 WebServer documentation beschrieben.

Wenn dies keine Webserver-Anwendung ist, sollten Sie vielleicht andere OAuth2 authentication flows verwenden.

+0

genau ist es kein Webserver-Anwendung. Unter der Google Developers-Anwendungskonsole habe ich den Anwendungstyp als INSTALLED APPLICATION verwendet. ..ich haben Authentifizierung OAuth2 wie hier https://github.com/google/google-api-ruby-client-samples/blob/master/drive/drive.rb fließt mit gesehen. Ich kann das implementieren, aber das einzige Problem ist, wie ich dieses spezifische Zugriffs-Token bekommen kann. vielleicht können Sie mir auf helfen, wie nur das Token zu erhalten. Danke für die Ans. – ben

+0

rechts, so dass der Google-Dokument für installierte Anwendungen befindet sich [hier] (https://developers.google.com/accounts/docs/OAuth2InstalledApp). Wie auch immer, Ihr Benutzer wird einem Browser-Fenster gegenübertreten, das Zuschüsse fordert. Und wiederum erhalten Sie 2 Tokens, einen für die Autorisierung und einen für die Aktualisierung. Da alle Anfragen nur HTTP-Anforderungen sind, können Sie das Rest-Client-Juwel verwenden, um der Dokumentation zu folgen. Darf ich Sie um Ihr Ziel bitten? Vielleicht Kontakte importieren? –

+0

ja, um alle E-Mail-Adressen zu importieren. irgendwelche Ideen, die mich dazu bringen können, es besser zu machen?Und ich habe auch versucht, dem Google Doc zu folgen, und es öffnet das Fenster, wo ich kopieren sollte, fügen Sie das Token zum Terminal ein. Ich hatte ein Problem: Wie man das Token automatisch erhält, wie sie in der Dokumentation vorschlagen. – ben

1

Um ein Aktualisierungstoken zu erhalten, müssen Sie alter the url.

in OAuth2:

url = client.auth_code.authorize_url(scope: OAUTH_SCOPE, access_type: "offline", redirect_uri: REDIRECT_URI)

Dann wird es verfügbar sein wie Erik Koleda erwähnt.