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.
Ist der Content-Type: application/x-www-form- urlencoded im Anforderungsheader? – mjn42
@ mjn42 danke das hat den Trick –