拿nodejs快速搭建簡單Oauth認證和restful API server攻略

拿nodejs快速搭建簡單Oauth認證和restful API server攻略:http://blog.csdn.net/zhaoweitco/article/details/21708955node

 

最近一直在鼓搗這個東西,拿出來分享下一下經驗吧,其實很簡單,一點也不難。git

首先需求是這樣,給本身的網站要增長API服務,API分爲兩種,公共的和私有受權的,受權的使用Oauth方法認證身份,API格式均爲JOSN和JSONP。github

嗯,別的語言我也沒怎麼學過,首先是找合適的框架進行實現吧。自己網站使用的express2.x開發的,再在express2.x的基礎上開發api接口感受太累了,找到了社區推薦的restify http://mcavage.github.io/node-restify/ 進行API開發,而後又搜到了一個開源的oauth的express中間件,https://github.com/ammmir/node-oauth2-provider算法

數據源是mongodb,那麼開搞吧。mongodb

首先是把api的策略和需求文檔整理出來,這裏有個還沒開發完的例子:express

https://github.com/xiaojue/tuer.me/blob/master/docs/index.mdjson

首先是受權方法和api講解,而後是api列表和實現地址與接口簡單說明,參數說明等。api

固然這寫都是在開始寫api以前要先大概設計好的。參見上面的地址。我也是參考了別的網站的api文檔本身胡亂寫的。大概就那麼個意思吧。。瀏覽器

而後在說具體開發的細節時,得先講明白啥是Oauth認證和restful,百科上有官方解釋,我就不本身忽悠了。我在這裏說下本身的白話理解。restful

首先restful是api的格式和規範,使用restify應該是幫你會保持好格式和一些特定的特徵的,這裏我沒作過多瞭解,文檔實在太多。。我只知道就像普通網站開發一下,寫好json接口就行了。

可是這寫api須要認證使用者的身份,這裏的使用者分爲2種身份,一種爲api調用程序,也就是開發者寫的代碼,一種是使用程序的普通用戶的身份須要驗證。

對程序的認證,我使用appkey和secret的方式認證,沒有這2個,是不容許請求api的。

appkey和secret簡單來講就是對程序的另一份密碼和賬號的實現。當開發者申請了一個appkey的時候,我經過算法來進行生成這2個東東,在程序請求api的時候經過對這2個的核對,來確保程序來源。

首先在本身網站上要先寫一個申請api的服務,而後作一個簡單的後臺對申請後的應用就行審覈,審覈其實就是生成appkey和secret的過程。

應用擁有了appkey和secret以後,公開的api能夠直接用參數帶appkey的方式獲取資源。受權api則須要經過用戶受權了,這裏就須要用到secret了。

具體流程是:

用戶使用第三方應用以前,第三方應用給出本站的一個受權頁面地址,參數夾帶appkey和回調地址,回調地址和以前申請的地址要一致,確保不會被釣魚。

用戶抵達個人站點受權應用以後,我會把瀏覽器從新定向到那個回調地址,帶一個臨時的code碼,這個code碼是和appkey成對應的。

第三方應用把這個code碼獲取以後,用這個code碼加appkey加程序的secret,來本站換取用戶的token,這個時候的secret不會對外部有暴露,就像密碼同樣,post給我,我再和對code和secret信息,完成對appkey的第二次校驗,以後根據這個用戶的特徵給這個用戶生成一個token,2份,我本地一份,第三方一份。

這個token就是用於校驗用戶身份的了,算法通常是採用可逆的加密方式,可是要有密鑰才能夠解開的。這裏就不詳細說了,能夠自行搜索serializer這個模塊,就是幹這個的。

token在加密的時候,自己會注入一些信息,好比這個用戶的id,生成時間戳,以及其餘一些你以爲有用的信息。

在下次第三方應用發token換取受權api的時候,主站能夠解開這個token,覈對時間戳【看token的有效期是否合法】看id是否存在,檢查一些其餘隱藏屬性是否被修改等,來進行再次身份確認。

個人程序token是100天的有效期。固然還會提供刷新token的方法,方法就和上面的過程相似了,拿老token換新token,2邊同步下便可。

ok,oauth算是大概說明白流程了。上面看起來很複雜的,可是有了最開始說的2個模塊以後,不少事情就不須要本身來幹了。

這裏給出2個參考文件:

https://github.com/xiaojue/tuer.me/blob/master/lib/OAP.js

這個是oauth在主站的路由控制,詳細api能夠見oauth2-provider的項目例子。裏面提供生成token的方法,生成受權表單的路由,對header攔截和校驗的功能等。很方便,只須要本身相應填空就行,固然要結合本身網站的數據進行查詢和校驗。

還有一個就是api的實現了,restify有很多的坑須要一一說明,首先是對中文的實現,編碼utf-8在官方的例子是設置req.setChart 可是,真正的最新2.x版本又去掉了這個功能,因此必須本身手動設置。

還有就是對oauth2的支持也並很差,若是用他的Authorization header parsing插件,對token放在url中,或者可能本身須要擴展的認證方法,很難修改【要改他的源碼。你pull request了吧,人家確定也不收。。】因此我是本身用restify的use本身寫了一個,參考代碼以下:

https://github.com/xiaojue/tuer.me/blob/master/api.js#L75

寫的很搓。。不過很通俗易懂了。。大概就是校驗幾個接受token的地方,而後解開token進行覈對確認身份,再看是否須要攔截。

固然在具體的api接口中,仍是須要再次確認了,好比一個api,是修改用戶資料,那麼應用傳了一個token,雖然合法,可是可能不是這個用戶的token,因此仍是須要在api中須要的地方再次進行身份認證。

因此我在req.authorization又進行了token的存儲。方便在接口中再次獲取校驗。

ok,而後就是編寫你本身的業務api了,和寫網站差很少,語法和思路和express也是同樣的。再給一個例子:

https://github.com/xiaojue/tuer.me/blob/master/routes/apis/feed.js

這是網站feed的api實現,一看就很簡單了。。須要注意的是,在往外吐的時候,仍是要配置個白名單。不然獲取用戶信息把pwd也反回去就囧了。。

ok。再詳細的攻略等我把api所有開發好了,上線以後再上 客戶端的demo例子吧。

相關文章
相關標籤/搜索