2017-02-02 2 views
2

Google 연락처를 사용하고 있습니다. 하지만 한 시간이 지나면 부여 된 액세스를 수동으로 새로 고쳐야합니다. 이 SO question에 따르면 나는이 호출 내 refresh_token도 업데이트 할 수 있어야한다 : 그것을 호출 할 때 난이 델파이 코드Google 연락처 토큰 만료

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; 

로 번역하지만, 한

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

은 내가 http/1.1 400 bad request 오류가

간단히 말해서 Google과의 연결을 유지하려면 어떻게해야합니까? @ mjn42의 도움으로

UPDATE

은 내가 내 요청에 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

이 콘텐츠 형식이다 : 응용 프로그램/x-형상 - 요청 헤더에 urlencoded? – mjn42

+1

@ mjn42 트릭을 해 주셔서 감사합니다 –

답변

2

요청 사용해야 https://tools.ietf.org/html/rfc6749#section-6의 사양에 따라 콘텐츠 형식 : 응용 프로그램/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 : = 'application/x-www-form-urlencoded'; 내 델파이 코드에 지금은 더 이상 실패하지 않습니다. 하지만 내 토큰은 한 시간 만에 만료됩니다! –

+0

요청이 반환하는 대상 (상태, 본문)은 무엇입니까? – mjn42

+0

나는 더 많은 테스트를 해봤는데 작동하도록했습니다. 고마워. –