2014-02-21 59 views
17

我想使用node.js的護照模塊返回一個refreshToken。 但是我使用下面的代碼,我無法記錄任何刷新令牌,但訪問令牌正常工作。 有沒有什麼辦法可以指定這個模塊離線訪問類型,希望能夠返回這個?Passport - Node.js不返回刷新標記

var GoogleStrategy = require('passport-google-oauth').OAuth2Strategy; 
passport.use(new GoogleStrategy({ 
clientID: GOOGLE_CLIENT_ID, 
clientSecret: GOOGLE_CLIENT_SECRET, 
callbackURL: "http://myurl/auth/callback" 
}, 
function(accessToken, refreshToken, profile, done) {                
    console.log(refreshToken); 
    process.nextTick(function() { 
     return done(null, [{token:accessToken}, {rToken:refreshToken}, {profile:profile}]); 
    }); 
} 
)); 

這將返回未定義的refreshToken。

任何幫助將不勝感激。

回答

21

這是解決了此鏈接:

https://github.com/jaredhanson/passport/issues/42

明確:

passport.authenticate('google', { scope: ['https://www.googleapis.com/auth/userinfo.profile', 
             'https://www.googleapis.com/auth/userinfo.email'], 
             accessType: 'offline', approvalPrompt: 'force' }); 

賈裏德·漢森 - 祝福你。

+0

這是行不通的。仍然將刷新標記值設爲未定義。 – Foreever

+1

您是否包含approvalPrompt:'force'選項?沒有這個對我來說,它仍然沒有定義。 – MonsterWimp757

+0

謝謝。現在它正在工作。 – Foreever

2

所有你需要的是accessType: 'offline',你會得到refreshToken在第一次登錄

不需要approvalPromptprompt在請求中。

在第一次登錄這僅適用,如果你不捕捉並保存refreshToken,並將其與在第一次登錄的用戶帳戶,你不能輕易再次獲取相關聯。

如果沒有捕獲它的第一次有人登錄時,你有兩個選擇:

  1. 如果用戶登錄,你沒有refreshToken對他們來說,可以立即強制註銷它們並告訴它們去https://myaccount.google.com/permissions並撤銷對應用程序的訪問,然後再次登錄。

    當他們再次登錄時,他們將獲得與第一次登錄時獲得的訪問相同的提示,並且您將在該第一次新登錄時獲得refreshToken。只要確保在Passport中的回調中有一個方法即可將refreshToken保存到您的數據庫中的用戶配置文件中。

    然後,您可以使用refreshToken請求旋轉的accessToken每當你需要調用谷歌的API。

  2. 您還可以添加accessType: 'offline'prompt: 'consent'選項,但這可能不是您想要的基於Web的應用程序。

    使用這些將提示每個用戶在每次登錄時都批准訪問您的應用。儘管名稱approvalPrompt沒有強制執行此操作,至少在當前版本的API中(根據提及的人數以及oAuth API更改的頻率來判斷,這種行爲以前可能完全不同)。

    對於基於Web的應用程序,這不是一個好方法,因爲它不是一個好的用戶體驗,但對調試可能很有用。