2017-02-02 2 views
2

Ich arbeite mit Google Kontakte und es läuft gut. Aber nach einer Stunde muss ich den gewährten Zugriff manuell aktualisieren. Nach dieser SO question sollte ich in der Lage sein, meine refresh_token mit diesem Aufruf zu aktualisieren:Google Kontakte-Token läuft ab

refresh_token = requests.post(
    'https://accounts.google.com/o/oauth2/token', 
    data={ 
     'client_id': APP_ID, 
     'client_secret': APP_SECRET, 
     'refresh_token': refresh_token, 
     'grant_type': 'refresh_token', 
    } 
) 

, die ich zu dieser Delphi-Code übersetzt haben

var 
    Http: TidHttp; 
    URLString: string; 
    Req, Resp: TStringStream; 
begin 
    Http := TidHttp.Create(nil); 
    try 
    URLString := 'client_id=' + FGoggleContacts.ClientID; 
    URLString := URLString + '&client_secret=' + FGoggleContacts.ClientSecret; 
    URLString := URLString + '&refresh_token=' + FGoggleContacts.RefreshToken; 
    URLString := URLString + '&grant_type=refresh_token'; 

    Req := TStringStream.Create(URLString); 
    Resp := TStringStream.Create(''); 
    HTTP.DoRequest(Id_HTTPMethodPost, 'https://accounts.google.com/o/oauth2/token', Req, Resp, []); 

    finally 
    Req.Free; 
    Resp.Free; 
    Http.Free; 
    end;  
end; 

aber beim Aufruf erhalte ich eine http/1.1 400 bad request Fehler

Kurz gesagt, wie halte ich meine Verbindung zu Google am Leben?

UPDATE

Mit Hilfe von @ mjn42 entdeckte ich, dass ich die Content-Type in meiner Anfrage fehlte. Also schrieb ich ein neues Verfahren mein Token zu aktualisieren:

procedure TGContacts.RefreshTokens; 
var 
    Http: TidHttp; 
    URLString: string; 
    Req, Resp: TStringStream; 
    JSon: ISuperObject; 
begin 
    Http := TidHttp.Create(nil); 
    Req := TStringStream.Create(''); 
    Resp := TStringStream.Create(''); 
    try 
    URLString := 'client_id=' + FClientID; 
    URLString := URLString + '&client_secret=' + FClientSecret; 
    URLString := URLString + '&refresh_token=' + FRefreshToken; 
    URLString := URLString + '&grant_type=refresh_token'; 
    Req.WriteString(URLString); 

    HTTP.Request.ContentType := 'application/x-www-form-urlencoded'; 
    HTTP.DoRequest(Id_HTTPMethodPost, 'https://accounts.google.com/o/oauth2/token', Req, Resp, []); 
    if HTTP.ResponseCode = 200 then 
    begin 
     JSon := SO(UTF8Decode(Resp.DataString)); 
     FAccessToken := JSon['access_token'].AsString; 
     if JSon['refresh_token'] <> nil then 
     FRefreshToken := JSon['refresh_token'].AsString; 
    end; 

    finally 
    Req.Free; 
    Resp.Free; 
    Http.Free; 
    end; 
end; 

Ich nenne nur, dass vor dem Zugriff auf das API dann die Token nicht verfallen.

+1

Ist der Content-Type: application/x-www-form- urlencoded im Anforderungsheader? – mjn42

+1

@ mjn42 danke das hat den Trick –

Antwort

2

Gemäß der Spezifikation bei https://tools.ietf.org/html/rfc6749#section-6 die Anforderung Content-Type verwenden sollte: application/x-www-form-urlencoded:

POST /token HTTP/1.1 
Host: server.example.com 
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW 
Content-Type: application/x-www-form-urlencoded 

grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA 
+0

Vielen Dank Ich habe hinzugefügt HTTP.Request.ContentType: = 'application/x-www-form-urlencoded'; zu meinem Delphi-Code und jetzt scheitert es nicht mehr. Aber mein Token läuft immer noch jede Stunde ab! –

+0

Was gibt die Anfrage zurück (Status, Körper)? – mjn42

+0

Ich habe noch mehr Tests gemacht, und ich habe es zum Laufen gebracht. Danke dir. –