2

현재 애플리케이션을 인증하기 위해 서버 측 OAuth2 플로우를 구현 중입니다.Google OAuth2 - 토큰에 대한 Exchange 액세스 코드 - 작동하지 않습니다.

JS 애플리케이션은 등록 된 CMS 계정 대신 YouTube 분석 데이터를 최종 사용자 (CMS 계정과 연결된 채널을 소유 한 사용자)에게 표시합니다. 따라서 인증 단계를 사용자가 완전히 숨길 필요가 있습니다. 일단 권한을 부여하려고 시도하면 '영구적 인'인증 코드를 사용하여 필요할 때 액세스 토큰을 검색합니다.

액세스 코드를 성공적으로 승인하고 검색 할 수 있습니다. 문제는 토큰에 대한 액세스 코드를 교환하려고 할 때 시작됩니다. 이 코드를 사용하고

이 같이 필요 달성하기 위해 HTTP POST 요청 ...

POST /o/oauth2/token HTTP/1.1 
Host: accounts.google.com 
Content-Type: application/x-www-form-urlencoded 

code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7& 
client_id=8819981768.apps.googleusercontent.com& 
client_secret={client_secret}& 
redirect_uri=https://oauth2-login-demo.appspot.com/code& 
grant_type=authorization_code 

이를 달성하기 위해 :

var myPOSTRequest = new XMLHttpRequest(); 



myPOSTRequest.open('POST', 'https://accounts.google.com/o/oauth2/token', true); 
myPOSTRequest.setRequestHeader('content-type', 'application/x-www-form-urlencoded'); 
myPOSTRequest.send('code=' + myAuthCode + '&redirect_uri=http%3A%2F%2Flocalhost%2FCMSAuth3.html&client_id=626544306690-kn5m3vu0dcgb17au6m6pmr4giluf1cle.apps.googleusercontent.com&scope=&client_secret={my_client_secret}&grant_type=authorization_code'); 

내가 성공적으로 200 OK 응답을 얻을 수 있습니다 그러나이 요청에는 액세스 토큰이 반환되지 않으며 myPOSTRequest.responseText는 빈 문자열을 반환합니다.

나는 Google의 OAuth 놀이터에서 놀았으며 자신의 자격증 명을 사용하여 성공적으로 토큰을 얻을 수 있습니다.

여기에 뭔가가 있습니까?

+1

귀하의 코드에서와 같이, 귀하는 보조금 유형으로 "인증 코드"를 사용하고 있습니다. – Emily

+0

안녕하세요 에밀리, 잘못된 사과를 붙여 넣었습니다. grant_type = authorization_code를 사용하여 정확한 예를 수정했습니다. – locksem

+0

실제 http 요청 및 응답을 붙여 넣습니다. 이것들을 Oauth Playground의 equivalents와 비교하십시오. – pinoyyid

답변

1

same origin policy이 있기 때문에이 작업을 수행 할 수 없습니다. 이것은 자바 스크립트가 귀하의 사이트가 아닌 다른 출처에서 응답을받지 못하게하는 최신 브라우저의 보안 개념입니다. 이것은 당신에게 CSRF으로부터 당신을 보호 할 수있는 능력을 제공하기 때문에 중요한 개념입니다. 따라서 코드 인증 흐름을 사용하지 말고 대신 token authorization flow을 사용하십시오.

+0

결국이 점을 깨달았습니다. 그래서 나는 이제 그 액세스 토큰을 검색하는 PHP 파일을 가지고 클라이언트 측 응용 프로그램에서 사용할 수 있도록 .txt 파일에 저장합니다. 이제 내 문제는이 액세스 토큰을 갖게되어 API를로드하려고하는 것입니다. 나는 XMLHttpRequest()를 사용해 보았지만 같은 cross-origin 문제로 실행했다. (구글의 문서에도 불구하고 CORS 친화적 인 방법이다.) – locksem

+0

시도하지 않았으므로 확실하지 않다. ,하지만 Google은 승인 흐름과 토큰 흐름으로 검색되는 액세스 토큰을 구별 할 수 있습니다.Fiddler를 사용하여 Google이 'Access-Control-Allow-Origin : *'과 같은 헤더를 보내면 –

1

전체 URL을 사용해보십시오. 그런 다음 웹 브라우저에 덤프하십시오. 그 핵심 요소가 있다면 json을 다시 얻을 수 있습니다. 당신은 corect 형식을 가지고 있습니다.

https://accounts.google.com/o/oauth2/token?code=<myAuthCode>&redirect_uri=<FromGoogleAPIS>&client_id=<clientID>&client_secret={my_client_secret}&grant_type=authorization_code 

다른 확인 사항 :

  1. 는 구글의 API에서 설정 같은 redirect_uri로를 사용하고 있는지 확인하십시오.
  2. Authcode를 어떻게 다시 받으시겠습니까? 당신이 페이지의 제목에서 그것을 riping하는 경우 제목에 전체 authcode를 반환하지 않는 문제가 페이지의 본문을 확인해보십시오. 이것은 항상 발생하지 않습니다. 나는 단지 우연히.
+0

이 예외가 항상 발생합니다. 어떤 단서? { 오류 : "invalid_request" error_description : "필수 매개 변수가 없습니다 : grant_type" } –

+0

GET 또는 POST 요청입니까? –

관련 문제