5

Google で認証する必要があるノード アプリケーションを開発しています。トークンをリクエストすると、https ://accounts.google.com/o/oauth2/token は次のように応答します。

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

curl で同じリクエストを作成しようとしましたが、同じエラーを受け取ったので、リクエストに何か問題があると思われますが、何が原因かわかりません。以下にコードを貼り付けました。

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);
        }
    });

送信するすべてのデータが正しいことを確認するためにトリプルチェックしましたが、それでも同じエラーが発生します。これをさらにデバッグするにはどうすればよいですか?

4

3 に答える 3

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();
                }
            }
        }
    );
}
于 2012-06-05T02:09:12.220 に答える
1

ここからnode.jsでHTTP POSTリクエストを作成するには? querystring.stringifyリクエストパラメータのクエリ文字列をエスケープするために使用できます。'Content-Type': 'application/x-www-form-urlencoded'さらに、POST リクエストに追加することをお勧めします。

于 2012-06-04T13:23:03.683 に答える
0

token_request var. から生成された最終的な文字列をここに投稿してください。これには何か問題がある可能性があります。または、認証コードの有効期限が切れているか、URL に正しく追加されていない可能性があります。通常、コードにはエスケープする必要がある「/」が含まれています。

于 2012-06-04T12:26:31.823 に答える