2014-11-14 49 views
0

上我們運行的是一個典型的均值設置 - 角針對前端的渲染,node.js的(表達)的服務器。 無需驗證即可從節點提供靜態HTML/Javascript資源。 前端顯示的所有數據都由節點的Angular請求。 Angular通過在ajax請求的「授權」頭中提供承載JWT令牌來授權用戶對節點端點。谷歌API的回調無狀態REST服務器

這工作完全,但我在一個死衚衕,當涉及到谷歌API的OAuth2集成在此設置。 的目標是在web應用以顯示用戶的日曆數據:

  1. 角請求/API /日曆從節點供給請求報頭中的承載令牌。
  2. 如果服務器沒有該用戶的谷歌訪問令牌但它創建一個谷歌令牌請求URL(包括callbackUrl/API /日曆/ googleCallback),並將其發送回角。
  3. 當角接收tokenRequest-URL作爲響應代替日曆數據,它將用戶重定向到該URL,在那裏他手動授予web應用的許可。
  4. Google重定向到回調 - 提供訪問碼的Url。

問題是步驟4 - ?作爲節點服務器是無狀態的重定向從谷歌到/API /日曆/ googleCallback代碼= XYZ不包含授權報頭的服務器不能識別更不用說認證用戶提供的訪問碼屬於。

動態添加某種散列識別用戶回調URL不工作(而且似乎相當不安全反正)作爲谷歌只接受預先規定的固定的回調網址。 我可以將用戶標識存儲在cookie中,但這感覺像違反了整體JWT方法。

的問題是,如果上述流程中的是一般一個壞主意,或是否有應對這種局面,使後端識別請求的回調屬於哪個用戶的最佳實踐。

謝謝!

回答

0

好吧 - 忽略了直接的解決方案:

使用令牌查詢其谷歌路線通過狀態 PARAM並追加到callbackurl:https://developers.google.com/accounts/docs/OAuth2Login#state-param

在節點:

var googleApi = require('googleapis'); 
var oauth2Client = new googleApi.auth.OAuth2(config.clientId, config.clientSecret, config.callbackUrl); 

var options = { 
    access_type: 'offline', 
    state: 'hashed-useridentified', 
    scope: [ 
     'https://www.googleapis.com/auth/calendar.readonly' 
    ].join(' ') 
}; 
oauth2Client.redirectUri_ = 'http://someserver.com/api/auth/google/calendar/callback'; 
var generatedUrl = oauth2Client.generateAuthUrl(options);