2015-01-26 2 views
2

Google Analytics API v3을 사용하고 있습니다. https://developers.google.com/accounts/docs/OAuth2WebServerAnalytics API에서 다음을 반환합니다. 잘못된 요청 - invalid_grant

는 첫째, OAUTH-URL이 사용자에 대해 생성됩니다 : 지금 내 응용 프로그램의 흐름 내가 여기에이 문서를 사용

을 설명 할 것이다. URL은 다음과 같습니다.

https://accounts.google.com/o/oauth2/auth? 
client_id={CLIENT-ID}& 
redirect_uri={REDIRECT-URL}& 
state={CUSTOM-NUMBER}& 
response_type=code& 
access_type=offline& 
approval_prompt=force& 
scope=https://www.googleapis.com/auth/analytics 

사용자가 링크를 클릭하면 인증됩니다. 그런 다음 코드를 사용하여 액세스 및 새로 고침 토큰을 가져옵니다.

내가 보내는 매개 변수 https://www.googleapis.com/oauth2/v3/token

code = Code from Analytics 
grant_type = authorization_code 
client_secret = CLIENT_SECRET 
client_id = CLIENT_ID 
redirect_uri = REDIRECT_URI 

컬 옵션을 요청을 전송하고있어 다음과 같다 :

CURLOPT_HTTPHEADER = array('Content-Type: application/x-www-form-urlencoded')

그리고 물론

이 포스트 데이터로 구축 http_build_query 그래서 그 content-type 헤더를 사용할 수 있습니다.

다음, 나는이 작품이 URL

https://www.googleapis.com/analytics/v3/management/accounts/~all/webproperties/~all/profiles

으로, 사용자의 모든 프로필을 얻고, 나는 모든 프로필을 나열하고있다. 그런 다음 사용자가 프로필 중 하나를 선택하면 내 라이브러리가 사용자의 현재 데이터 (페이지 뷰, 방문 등)를 가져옵니다.

문제는 제가 데이터를 새로 고침 할 때입니다. 매일 cron을 사용하면 오류 메시지가 나타납니다.

'error' => 'invalid_grant', 
'error_description' => 'Bad Request' 

그러나 나는 모릅니다. 왜 그런가요?

내 데이터베이스의 프로필에 대한 액세스 토큰과 새로 고침 토큰을 저장했습니다. 그런 다음 데이터 액세스 요청을하기 전에 데이터를 다시 액세스 할 때 토큰이 유효한지 확인합니다. 그러나 이것조차도 실패합니다.

나는 액세스 토큰 난 그냥 인증 5 초 후에 토큰이 더 이상 유효하지 않기 때문에, 신비 어떤 (무효라고, 여기

https://accounts.google.com/o/oauth2/tokeninfo?access_token=ya29.BwHqH8NOPVhafk3SnwbqjLZMXub4Q8bemC-8vKVwp-UjRqaIHRXrzEV3WjInhGzl1-phIn7XI4NnDA

그것은 나에게 말한다을 요청하고 있어요 ?

어쨌든, 그때,

URL: https://www.googleapis.com/oauth2/v3/token 
Parameters: 

client_secret = CLIENT_SECRET 
client_id = CLIENT_ID 
refresh_token = REFRESH_TOKEN From my database 
grant_type = refresh_token 

cURL Options: CURLOPT_HTTPHEADER = array('Content-Type: application/x-www-form-urlencoded') 

그런 다음이 요청 위스콘신 내장 PARAMS와 POST 요청을 그것을 다시 시도 일 http_build_query는

응답이

string(67) "{ "error": "invalid_grant", "error_description": "Bad Request" } " 

처럼 보인다하지만 난 왜 아무 생각이 없습니다. 액세스 토큰을 사용하고 있으며 5 분 전에 얻은 새로 고침 토큰과 첫 번째 요청에 사용 된 토큰을 새로 고칩니다. 5 분 후에 같은 토큰으로 작동하지 않는 이유는 무엇입니까? 토큰을 새로 고칠 수없는 이유는 무엇입니까?

답변

2

잘못된 승인에는 일반적으로 두 가지 원인이 있습니다.

  1. 서버의 시계가 NTP와 동기화되지 않았습니다. (해결 방법 : 서버 시간을 검사하여 올바르지 않은 경우 서버 시간을 확인하십시오.)
  2. 새로 고침 토큰 제한을 초과했습니다. (해결책 : 할 수있는 일이 없으면 새로 고침 토큰을 사용할 수 없습니다.) 응용 프로그램에서 여러 개의 새로 고침 토큰을 요청할 수 있습니다. 예를 들어 사용자가 여러 컴퓨터에 응용 프로그램을 설치하려는 경우에 유용합니다. 이 경우 각 설치마다 하나씩 두 개의 새로 고치기 토큰이 필요합니다. 새로 고침 토큰 수가 제한을 초과하면 이전 토큰이 유효하지 않게됩니다. 응용 프로그램이 유효하지 않은 새로 고침 토큰을 사용하려고하면 invalid_grant 오류 응답이 반환됩니다. OAuth 2.0 클라이언트의 각 고유 한 쌍에 대한 한도이며 25 개의 새로 고침 토큰입니다 (이 제한은 변경 될 수 있음에 유의하십시오). 응용 프로그램이 동일한 클라이언트/계정 쌍에 대한 새로 고치기 토큰을 계속 요청하면 26 번째 토큰이 발행되면 이전에 발행 된 첫 번째 새로 고침 토큰이 유효하지 않게됩니다. 27 번째 요청 된 새로 고침 토큰은 이전에 발행 된 두 번째 토큰을 무효화합니다.

새로 고침 토큰 만 저장해야합니다. 액세스 토큰은 한 시간 후에 만료됩니다. 다른 전화 인 Google 3 legged Oauth2 flow에서 걸어 볼 수 있습니다.

코드에서 알 수없는 것을 조금 혼란스럽게 보였습니다. 그러나 나는 정말로 틀린 것을 보지 못했습니다. 그래서 그것이 제가 처음 두 이슈 중 하나 일지 모른다고 추측합니다.

+0

안녕하세요, 답변 해 주셔서 감사합니다. 1. 현재 날짜는'Mon Jan 26 11:31:12 CET 2015'입니다.이 말은 나에게 딱 맞습니다. 2. 문제는 새 새로 고침 토큰을 생성하지 않는다는 것입니다. 액세스 토큰을 새로 고치려면 액세스 토큰이 작동하지 않습니다. 또한 5 분 전에 발급 된 액세스 토큰을 사용하고 있습니다. 의미, 여전히 작동해야합니까, 그렇지 않아야합니까? 또한 내가 말했듯이, 액세스 토큰이 유효하지 않은 경우 새로 고침 토큰을 사용하여 새 토큰을 생성하려고합니다. 그러나 새로 고침 토큰이 새로 고쳐지지 않습니다. 그냥 액세스 토큰. – Musterknabe

+0

코드에서 변경할 수있는 것이 있습니까? 아니면 이해를 돕기위한 추가 코드를 제공 할 수 있습니까? – Musterknabe

+0

새 액세스 토큰을 요청할 때 새로 고침 토큰을 사용하면 다시 사용자의 액세스를 요청하지 않으면 새로 고침 토큰이 변경되지 않는 새로운 액세스 토큰이 제공됩니다. – DaImTo

0

나는이 문제가 구식 인 것을 알고 있지만, 코드가 때로는 슬래시 (/)로 인해 리디렉션 URL에서 추출하는 동안 제대로 디코딩하지 못해서이 문제가 발생했습니다.

4/BGrvsJeuc5BoRRN ...와 같은 토큰은 4%2FBGrvsJeuc5BoRRN ...과 같은 서버에 저장됩니다.

다른 사람이 내가 한 것처럼 바보가 될 경우에 대비하여 게시하십시오.

관련 문제