OAuth2 + REST 的API认证服务器部署方案

网络上很多网站平台都开放了API的授权机制,就比如想在京东上购物,却发现没有京东账号。京东有提供第三方账号登录方式,可以使用QQ账号登录,这种就是OAuth账号登录的使用场景。
这个其实已经是老旧的知识,现在很多公司内部已经不再需要开发API认证服务器。现在反正更多需要的是客户端获取token后,如何处理token的业务。但是熟悉下整个OAuth2部署方案还是有必要的

储备知识

对OAuth2还不了解的话,可以参考阮一峰老师的这篇博客理解OAuth2
很多大公司都把client_secret作为必选项,这篇博客漏掉了这个选项,但不影响理解OAuth2
REST是表述性状态传递,是一种Web软件开发风格。对REST不了解的话,可以参考Quora上面的一篇回答What is a REST API?

额外了解

看完上面的储备知识,你需要了解的额外的是:
很多网站提供的客户端API接入请求是需要申请,经过服务提供商审核的(会发放 client_id, cilent_secret).

部署方案

  1. 应用请求用户授权,跳转到API认证服务器相关页面
  2. API认证服务器判断用户是否登录,未登录就跳转到登录页面,登录的话,跳转到授权页面,并记录用户的userid
  3. 编写中间件,来验证client_id和redirect_uri.
  4. 显示应用授权页面

    app.get('验证页面的API地址',中间件1,中间件2,function(req,res,next){
    res.render('验证页面')
    })

    用户点击后,以POST的方式提交表单

  5. 处理授权

    app.post('',function(req,res){
    // 生成授权码
    // 根据传递过来的redirect_uri&s授权码,跳转回原来的应用
    })
  6. 应用拿到授权码后,post授权码、client_id、client_secret到API服务器获取token的接口,API服务器进行验证这些信息,验证通过返回token

应用拿到token后,如果发送到资源服务器(资源服务器可能跟API服务器是同一个)的请求都需要附带token,进行验证。

细节问题

  1. 如何处理token过期问题?
    可以在返回的token中附带过期时间,eg:随机数.(当前时间+相对过期时间)。验证token的时候,就可以判断这个时间是否过期
  2. API传输的过程安全问题?
    使用HTTPS
  3. API请求频率限制
    使用Redis来存储相关请求次数,判断请求次数是否超过限制
  4. 如何设定返回的数据格式
    方法一:

    app.get('/api/articles.*',function(req, res){
    // 获取url中末尾请求格式
    var type = path.extname(require('url').parse(req.url).pathname);
    })

    方法二:
    通过设置Accept请求头来指定返回的数据格式

  5. 数据模拟
    使用Node.js中faker模块来模拟