拿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例子吧。

相关文章
相关标签/搜索