2012-06-04 162 views
4

我正在開發其需要與谷歌認證的節點應用。當我請求令牌,https://accounts.google.com/o/oauth2/token與迴應:無效的oauth2令牌請求

error: 400 
{ 
    "error" : "invalid_request" 
} 

我試圖使在捲曲相同的請求,並已收到了同樣的錯誤,所以我懷疑有什麼不對我的要求,但我不能弄清楚什麼。我下面粘貼我的代碼:

var request = require('request'); 
var token_request='code='+req['query']['code']+ 
        '&client_id={client id}'+ 
        '&client_secret={client secret}'+ 
        '&redirect_uri=http%3A%2F%2Fmassiveboom.com:3000'+ 
        '&grant_type=authorization_code'; 
request(
    { method: 'POST', 
     uri:'https://accounts.google.com/o/oauth2/token', 
     body: token_request 
    }, 
    function (error, response, body) { 
     if(response.statusCode == 201){ 
      console.log('document fetched'); 
      console.log(body); 
     } else { 
      console.log('error: '+ response.statusCode); 
      console.log(body); 
     } 
    }); 

我三重檢查,以確保所有我提交的數據是正確的,我仍然得到同樣的錯誤。我能做些什麼來進一步調試?

+0

這裏發佈從token_request生成的最終字符串var.that可能有錯誤。 – sudmong

回答

3

事實證明,request.js(https://github.com/mikeal/request)不會自動包括內容長度的報頭。我手動添加它,它在第一次嘗試中工作。我粘貼了下面的代碼:

exports.get_token = function(req,success,fail){ 
    var token; 
    var request = require('request'); 
    var credentials = require('../config/credentials'); 
    var google_credentials=credentials.fetch('google'); 
    var token_request='code='+req['query']['code']+ 
     '&client_id='+google_credentials['client_id']+ 
     '&client_secret='+google_credentials['client_secret']+ 
     '&redirect_uri=http%3A%2F%2Fmyurl.com:3000%2Fauth'+ 
     '&grant_type=authorization_code'; 
    var request_length = token_request.length; 
    console.log("requesting: "+token_request); 
    request(
     { method: 'POST', 
      headers: {'Content-length': request_length, 'Content-type':'application/x-www-form-urlencoded'}, 
      uri:'https://accounts.google.com/o/oauth2/token', 
      body: token_request 
     }, 
     function (error, response, body) { 
      if(response.statusCode == 200){ 
       console.log('document fetched'); 
       token=body['access_token']; 
       store_token(body); 
       if(success){ 
        success(token); 
       } 
      } 
      else { 
       console.log('error: '+ response.statusCode); 
       console.log(body) 
       if(fail){ 
        fail(); 
       } 
      } 
     } 
    ); 
} 
+0

說的是'在node.js'例如HTTP POST請求第二插頭:) –

+0

的POST例如沒有工作,因爲它沒有把所有的頭谷歌需要的。 – devnill

0

張貼在這裏從token_request var.that生成的最終字符串可能有一些錯誤。或者可能是驗證碼已過期或未正確添加到URL中。通常代碼中有'/',需要轉義。

1

從這裏How to make an HTTP POST request in node.js?你可以使用querystring.stringify逃脫的請求參數查詢字符串。另外,您最好爲POST請求添加'Content-Type': 'application/x-www-form-urlencoded'

+0

我嘗試使用require將它作爲表單添加爲缺省內容類型,但仍然失敗。 – devnill

相關問題