2012-06-04 2 views
4

Я разрабатываю приложение-узел, которое необходимо аутентифицировать с помощью google. Когда я запросить маркер, 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

Это было в запросе HTTP POST в примере node.js как второй заголовок :) –

+0

Пример POST не работал, потому что он не отправлял все заголовки, требуемые Google. – devnill

0

сообщение здесь окончательная строка, сгенерированная из token_request var.that, возможно, что-то не так. или может быть аутентификационный код истек или неправильно добавлен в URL. Обычно код имеет '/', который должен быть экранирован.

1

отсюда How to make an HTTP POST request in node.js? вы можете использовать querystring.stringify, чтобы избежать строки запроса параметров запроса. Кроме того, вам нужно добавить 'Content-Type': 'application/x-www-form-urlencoded' для запроса POST.

+0

Я попробовал использовать, чтобы отправить его как форму, чтобы добавить это как тип содержимого по умолчанию, и он все еще не прошел. – devnill

Смежные вопросы