0

Я пытаюсь создать службу аутентификации Node.js для аутентификации с помощью Google OAuth api.Попытка аутентификации с помощью Google OAuth и получения ошибки «Необходимый параметр отсутствует: grant_type»

У меня есть этот код:

private exchangeTokens(code: string): Rx.Observable<IAuthTokens>{ 

    code = decodeURIComponent(code); 

    console.log(`exchanging code for tokens: ${code}`); 

    const redirectUri = "http://localhost:8080"; 

    let url = YouTubeAuthenticationServer.baseUrl + "token"; 

    var postData= "code=" + encodeURIComponent(code); 
    postData += "&redirect_uri=" + encodeURIComponent(redirectUri); 
    postData += "&client_id=" + encodeURIComponent(process.env.CLIENT_ID); 
    postData += "&client_secret=" + encodeURIComponent(process.env.CLIENT_SECRET); 
    postData += "&scope="; 
    postData += "&grant_type=authorization_code"; 

    return this.makePostRequest<IAuthTokens>(url,postData); 
} 

private makePostRequest<T>(targetUrl:string, data: string): Rx.Observable<T>{ 

    console.log(`getting targetUrl: ${targetUrl}`); 

    var urlObject = url.parse(targetUrl); 

    var options: http.RequestOptions = { 
     hostname: urlObject.hostname, 
     port: Number(urlObject.port), 
     path: urlObject.path, 
     protocol: "https:", 
     method: "POST" 
    }; 

    const request = https.request(options); 

    const returnObservable = Rx.Observable.fromEvent(<any>request, "response") 
     .take(1) 
     .flatMap(response => RxNode.fromWritableStream(<any>response)) 
     .do(data => console.log(`data pumped: ${data}`)) 
     .toArray() 
     .map(function(allData){ 
      return JSON.parse(allData.join("")) as T; 
     }); 

    console.log(`write data: ${data}`); 

    request.write(data); 
    request.end(); 

    return returnObservable; 
} 

и от этого я получаю следующие журналы:

exchanging code for tokens: 4/k6Pp7jCPDms2meo0qfINqs0c9FZSjJ7PvGp8mdnh3Y8# 
getting targetUrl: https://accounts.google.com/o/oauth2/token 
write data: code=4%2Fk6Pp7jCPDms2meo0qfINqs0c9FZSjJ7PvGp8mdnh3Y8%23&redirect_uri=http%3A%2F%2Flocalhost%3A8080&client_id=myCorrectId&client_secret=myCorrectSecret&scope=&grant_type=authorization_code 
data pumped: { 
    "error" : "invalid_request", 
    "error_description" : "Required parameter is missing: grant_type" 
} 

Так я посылаю следующее:

code=4%2Fk6Pp7jCPDms2meo0qfINqs0c9FZSjJ7PvGp8mdnh3Y8%23 
redirect_uri=http%3A%2F%2Flocalhost%3A8080 
client_id=myCorrrectId 
client_secret=myCorrectSecret 
scope= 
grant_type=authorization_code 

Так что я могу» t понять, почему он говорит, что я не отправляю grant_type

ответ

0

Много большого спасибо João Angelo для этого ответа (публикуемого в комментариях ниже)

Убедитесь, что запрос содержит этот заголовок: Content-Type: application/x-www-form-urlencoded , как Google может разрешить другие типы содержимого и может быть искажая полезную нагрузку.

код теперь выглядит следующим образом:

private makePostRequest<T>(targetUrl:string, data: string): Rx.Observable<T>{ 

    console.log(`getting targetUrl: ${targetUrl}`); 

    var urlObject = url.parse(targetUrl); 

    var options: http.RequestOptions = { 
     hostname: urlObject.hostname, 
     port: Number(urlObject.port), 
     path: urlObject.path, 
     protocol: "https:", 
     method: "POST", 
     headers: { 
      "Content-Type": "application/x-www-form-urlencoded" 
     } 
    }; 

    const request = https.request(options); 

    const returnObservable = Rx.Observable.fromEvent(<any>request, "response") 
     .take(1) 
     .flatMap(response => RxNode.fromWritableStream(<any>response)) 
     .do(data => console.log(`data pumped: ${data}`)) 
     .toArray() 
     .map(function(allData){ 
      return JSON.parse(allData.join("")) as T; 
     }); 

    console.log(`write data: ${data}`); 

    request.write(data); 
    request.end(); 

    return returnObservable; 
} 
0

Если вы не хотите указывать scope, тогда не добавляйте "&scope=". Сервер может быть интерпретировать ваш запрос как просить области:

&grant_type=authorization_code 

Что бы тогда означать запрос фактически не содержать grant_type.

+0

Я только добавил сферу, как это то, что передается на примере на площадке Google OAuth. Он не работает, когда он удаляется. – Roaders

+1

Также убедитесь, что запрос содержит этот заголовок 'Content-Type: application/x-www-form-urlencoded', поскольку Google может разрешать другие типы контента и может неправильно интерпретировать полезную нагрузку. –

+0

YESSS !!!!!! Спасибо, Джоан. Я добавлю это как ответ и приму это. – Roaders