2017-02-02 15 views
2

私はGoogleの連絡先と一緒に働いています。しかし、1時間後に私は手動で許可されたアクセスをリフレッシュする必要があります。このSO questionによると、私はこの呼び出しで私のrefresh_tokenを更新することができるはずです:Googleコンタクトのトークンは有効期限が切れます

私は、このDelphiコード

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; 

に翻訳されてきたが、それを呼び出すときに、私はhttp/1.1 400 bad requestエラー

を取得
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', 
    } 
) 

私はどのようにしてGoogleとの接続を維持していますか?

UPDATE

mjn42 @からの助けを借りて、私は私が私の要求にContent-Typeを欠けていたことを発見しました。だから、私はトークンをリフレッシュするための新しい方法を書いた:

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; 

私はちょうどそのトークンの有効期限が切れていないAPIにアクセスする前にそれを呼び出します。

+1

は、Content-Typeのです:アプリケーション/ X-WWW-フォーム - リクエストヘッダにurlencoded? – mjn42

+1

@ mjn42トリックをしてくれてありがとう –

答えて

2

要求を使用する必要がありますhttps://tools.ietf.org/html/rfc6749#section-6の仕様によるとのContent-Type:アプリケーション/ 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

ありがとう、私はHTTP.Request.ContentType:= 'アプリケーション/ x-www-form-urlencoded'を追加しました。私のデルファイのコードに、今はもう失敗しません。しかし、私のトークンは1時間ごとに失効します! –

+0

リクエストは何を返すのですか(ステータス、本文)? – mjn42

+0

私はもう少しテストをしました。私はそれを動作させました。おかげさまで。 –

関連する問題