2014-01-13 23 views
1

我有一個的node.js服務器應用INVALID_REQUEST從Node.js的

app.get('/AuthorizeGoogle.html',function(req,res) { 
    var auth  = new googleapis.OAuth2Client(config.google_login.client_id, config.google_login.client_secret, config.google_login.redirect_uri); 
    var queryData = url.parse(req.url,true).query; 
    var code  = encodeURIComponent(queryData.code); 

    console.log('Authorization Request recieved ');; 

    console.log('Retrieiving token'); 
    auth.getToken(code,function(err,tokens) { 
     console.log('Retrievied token '); 
     console.log(tokens); 
     console.log('**** ERROR ****'); 
     console.log(err); 

     console.log('Calling setCredentials'); 
     auth.setCredentials(tokens); 
     console.log('*****FINISHED!!!!!'); 
    }); 

    res.send('Authorization recieved ' + queryData.code) 
}); 

當谷歌的回報,並且用戶已經授權訪問他們的帳戶,谷歌這就是所謂下面的代碼。

我得到一個代碼。但是,當auth.getToken()我越來越invalid_request。我已經成功地在C#中做到了這一點,但我現在正在更多的開源工具,因此移動項目Node.js加載

在此先感謝

行 - 我再次建議的頁面看起來和做了一些重構我的代碼和工作。我認爲可能是這個問題的是Url過去首先獲得令牌。

我已經初始化的oauth2Client

var OAuth2Client = googleapis.OAuth2Client; 
var oauth2Client; 
oauth2Client = new OAuth2Client(config.google_login.client_id, config.google_login.client_secret, config.google_login.redirect_uri); 

所需的客戶端ID,祕密和重定向URL已經在配置文件中

被定義所以首先我改變了我生成URL的方式。首先,我將Url設置爲Google登錄到GoogleLogin.html,當服務器收到此頁面的請求時,它會執行以下操作。

app.get('/GoogleLogin.html',function(req,res) { 
    var scopes = ""; 

    // retrieve google scopes 
    scopes += config.google_login.scopes.baseFeeds + " " 
    scopes += config.google_login.scopes.calendar + " " 
    scopes += config.google_login.scopes.drive + " " 
    scopes += config.google_login.scopes.driveMetadata + " " 
    scopes += config.google_login.scopes.profile + " " 
    scopes += config.google_login.scopes.email + " " 
    scopes += config.google_login.scopes.tasks 

    var url = oauth2Client.generateAuthUrl({ 
     access_type: 'offline', 
     scope: scopes 
    }); 

    res.writeHead(302, {location: url}); 
    res.end(); 


}); 

這首先重定向到生成的URL之前建設範圍,然後生成授權URL的字符串

當谷歌重定向到該網站執行

app.get('/AuthorizeGoogle.html',function(req,res) { 
    // var auth = new googleapis.OAuth2Client(config.google_login.client_id,config.google_login.client_secret, config.google_login.redirect_uri); 
    var queryData = url.parse(req.url,true).query; 
    var code  = queryData.code; 

    console.log('Authorization Request recieved ');; 

    console.log('Retrieving token'); 
    oauth2Client.getToken(code,function(err,tokens) { 
     console.log('Retrieved token '); 
     console.log(tokens); 
     console.log('**** ERROR ****'); 
     console.log(err); 

     console.log('Calling setCredentials'); 
     oauth2Client.setCredentials(tokens); 
     console.log('*****FINISHED!!!!!'); 
    }); 

    res.send('Authorization recieved ' + queryData.code) 
}); 

這下面現在正確返回令牌和刷新令牌。由於它是相同的代碼,我唯一能做的就是錯誤的是最初打給Google的電話。

+1

你不應該叫'encodeURIComponent'。 – SLaks

+0

謝謝,但我補充說,看看它是否需要它 - 我仍然得到invalid_request沒有它。 –

+0

[Error:invalid \ _request getToken]可能重複(http://stackoverflow.com/questions/33874339/error-invalid-request-gettoken) – locrizak

回答