使用passport.js和express.js(node.js)建立一個安全的oauth API
我有一個特定的問題,除非我沒有以正確的方式做事情.
我有兩個應用程式,一個客戶端(html站點)和一個API(用快速mongodb構建). API將需要安全訪問.他們都在不同的領域,現在讓我們的網站在domain.com上,我的API在api.com:3000.
我在使用資料建立使用者時,添加了護照以獲取Github的訪問令牌,所以我可以使用“Github”登入.
我目前的過程是:
1)客戶端(站點)在API上開啟彈出視窗
window.open("http://api.com:3000/oauth")
2)快遞伺服器,啟動護照過程:
app.get('/oauth', passport.authenticate('github'), function(req, res) { });
對於策略,我用了ofollow,noindex" target="_blank">this code .
3)我將回調重定向到關閉彈出視窗的url(帶有window.close()的javascript):
app.get('/oauth/callback', passport.authenticate('github', { failureRedirect: '/' }), function(req, res) { res.redirect('/auth_close'); });
在這一點上,一切都很好,我現在已經登入了API.我的問題是如何獲取資料回到客戶端,因為客戶端還不瞭解accessToken,user或user id.
所以,從客戶端(開啟彈出視窗的網站),我嘗試了不同的方法:
從彈出視窗獲取值:由於重定向不起作用,我忘了彈出JavaScript資訊
呼叫我的API來獲取會話中的“當前使用者”,如http://api.com:3000/current
再一個請求,不理想,但這一個工作.但是,我還是有一個問題.
如果我從瀏覽器到達這個/當前url返回使用者,因為瀏覽器在標頭檔案中傳送快速會話cookie:
Cookie:connect.sid=s%3AmDrM5MRA34UuNZqiL%2BV7TMv6.Paw6O%2BtnxQRo0vYNKrher026CIAnNsHn4OJdptb8KqE
問題是我需要從jquery或類似的請求,這是失敗的地方,因為會話沒有傳送.所以使用者沒有返回:
app.get('/current', function() { // PROBLEM HERE, req.user is undefined with ajax calls because of the session! });
我找到了一種使其工作的方式,但我不高興,因為我會有跨瀏覽器的CORS問題,它正在新增來表達:
res.header("Access-Control-Allow-Credentials", "true");
並在jquery ajax呼叫中新增withCredentials欄位,如jQuery.ajax/" rel="nofollow,noindex" target="_blank">here 所述.
要在本機XHR物件上設定的fieldName-fieldValue對的對映.例如,如果需要,您可以使用它將跨域請求的Credentials設定為true.
$.ajax({ url: a_cross_domain_url, xhrFields: { withCredentials: true } });
我也不滿意,因為我丟失了我的標題上的萬用字元:Access-Control-Allow-Origin,我需要指定一個域,如HTTP/Access_control_CORS?redirectlocale=en-US&redirectslug=HTTP_access_control#Requests_with_credentials" rel="nofollow,noindex" target="_blank">here 所述.
所以,我不知道我應該採取的方法,我唯一需要的是客戶端獲取accessToken或從護照oauth程序返回的userID.這個想法是在API的每次呼叫中使用該標記來驗證呼叫.
任何線索?
我遇到過同樣的問題.我在登入頁面上使用本地策略,然後檢查使用者是否在其他請求的會話中.
正如你所說,解決方案是使用CORS,以便使用XMLHTTPRequest在cookie中傳遞會話ID.
不用使用在所有瀏覽器上還沒有工作的CORS,我勉強使用對其他請求的訪問令牌.我使用的工作流程如下:
POST /login
>使用者名稱和密碼在身體中傳遞.
>使用本地策略的身份驗證.
> Response返回使用者物件,包括access_token
GET / endpoint / abc123?access_token = abcdefg
>從登入響應獲得的令牌
>使用承載策略進行認證(在護照http-bearer中)
Express現在不需要會話.
我希望這個替代方案有所幫助.
程式碼日誌版權宣告:
翻譯自:http://stackoverflow.com/questions/13933980/make-a-secure-oauth-api-with-passport-js-and-express-js-node-js