拿nodejs快速搭建简单Oauth认证和restful API server攻略:http://blog.csdn.net/zhaoweitco/article/details/21708955

最近一直在鼓捣这个东西,拿出来分享下一下经验吧,其实很简单,一点也不难。

首先需求是这样,给自己的网站要增加API服务,API分为两种,公共的和私有授权的,授权的使用Oauth方法认证身份,API格式均为JOSN和JSONP。

嗯,别的语言我也没怎么学过,首先是找合适的框架进行实现吧。本身网站使用的express2.x开发的,再在express2.x的基础上开发api接口感觉太累了,找到了社区推荐的restify http://mcavage.github.io/node-restify/ 进行API开发,然后又搜到了一个开源的oauth的express中间件,https://github.com/ammmir/node-oauth2-provider

数据源是mongodb,那么开搞吧。

首先是把api的策略和需求文档整理出来,这里有个还没开发完的例子:

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

首先是授权方法和api讲解,然后是api列表和实现地址与接口简单说明,参数说明等。

当然这写都是在开始写api之前要先大概设计好的。参见上面的地址。我也是参考了别的网站的api文档自己胡乱写的。大概就那么个意思吧。。

然后在说具体开发的细节时,得先讲明白啥是Oauth认证和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例子吧。

拿nodejs快速搭建简单Oauth认证和restful API server攻略的更多相关文章

  1. 使用Django快速搭建简单的数据管理后台

    使用Django快速搭建简单的数据管理后台 概述 需求描述: 数据表已建好,能可视化操作增删改查,避免直接操作数据库 简版的管理系统 环境 Windows 10 x64 Python 3.6.3 (A ...

  2. 【重学Node.js 第1&2篇】本地搭建Node环境并起RESTful Api服务

    本地搭建Node环境并起RESTful Api服务 课程介绍看这里:https://www.cnblogs.com/zhangran/p/11963616.html 项目github地址:https: ...

  3. Laravel 中使用 JWT 认证的 Restful API

    Laravel 中使用 JWT 认证的 Restful API 5天前/  678 /  3 / 更新于 3天前     在此文章中,我们将学习如何使用 JWT 身份验证在 Laravel 中构建 r ...

  4. 使用Node.js快速搭建简单的静态文件服务器

    做前端有时会采用一些复杂框架,在文件系统中直接打开页面(用file:///方式打开),往往会报跨域的错,类似于“XMLHttpRequest cannot load ...(文件名). Cross o ...

  5. 用pytorch1.0快速搭建简单的神经网络

    用pytorch1.0搭建简单的神经网络 import torch import torch.nn.functional as F # 包含激励函数 # 建立神经网络 # 先定义所有的层属性(__in ...

  6. k8s使用自定义证书将客户端认证接入到API Server

    自定义证书使用kubectl认证接入API Serverkubeconfig是API Server的客户端连入API Server时使用的认证格式的客户端配置文件.使用kubectl config v ...

  7. json server的简单使用(附:使用nodejs快速搭建本地服务器)

    作为前端开发人员,经常需要模拟后台数据,我们称之为mock.通常的方式为自己搭建一个服务器,返回我们想要的数据.json server 作为工具,因为它足够简单,写少量数据,即可使用. 安装 首先需要 ...

  8. 快速搭建简单的LBS程序——地图服务

    很多时候,我们的程序需要提供需要搭建基于位置的服务(LBS),本文这里简单的介绍一下其涉及的一些基本知识. 墨卡托投影 地图本身是一个三维图像,但在电脑上展示时,往往需要将其转换为二维的平面图形,需要 ...

  9. Django + mysql 快速搭建简单web投票系统

    了解学习pyhton web的简单demo 1. 安装Django, 安装pyhton 自行百度 2. 执行命令创建project  django-admin.py startproject mysi ...

随机推荐

  1. 博客引索 - imsoft.cnblogs

    Java C Delphi 日常工具 图片处理 视频处理 系统工具 知识经验 奇思妙想 网站推荐

  2. hdu 4258 Covered Walkway

    题目大意: 一个N个点的序列,要将他们全部覆盖,求总最少费用:费用计算: c+(x-y)2 分析: 斜率优化DP 我们假设k<j<i.如果在j的时候决策要比在k的时候决策好,那么也是就是d ...

  3. Java-->实现断点续传(下载)

    --> 断点续传: 就像迅雷下载文件一样,停止下载或关闭程序,下次下载时是从上次下载的地方开始继续进行,而不是重头开始... --> RandomAccessFile --> poi ...

  4. css selector

    文章一: http://www.jb51.net/css/68287.html 去年我学jQuery的时候,曾经做过一点选择器(selector)的笔记,今天是CSS的选择器,以后还有一部分xPath ...

  5. codefoces round193a

    link: http://codeforces.com/contest/332/problem/A /* ID: zypz4571 LANG: C++ TASK: 193a.cpp */ #inclu ...

  6. hdu1811 并查集+拓扑序

    题意:现在有一个排名系统,有一系列信息,分别是 > < = 的比较,而如果最终相等,就会将这些相等的按照序号从小到大排,问给出的信息是否可以确定完整的排序. 由于如果很多点相等,他们肯定能 ...

  7. Hammer.js移动端触屏框架的使用

    hammer.js是一个多点触摸手势库,能够为网页加入Tap.Double Tap.Swipe.Hold.Pinch.Drag等多点触摸事件,免去自己监听底层touchstart.touchmove. ...

  8. C 语言中 free() 函数简单分析

    又是一个睡不着的夜晚,现在是凌晨03:16,不知道是不是感冒的原因,头脑并不是清醒,但是就是睡不着.摸着黑打开电脑,洗了杯子抓了点茶叶,然后打开饮水机电源.舍友们都睡着了,我戴着耳机听着轻音乐,也能听 ...

  9. java的nio之:java的nio系列教程之pipe

    Java NIO 管道是2个线程之间的单向数据连接.Pipe有一个source通道和一个sink通道.数据会被写到sink通道,从source通道读取. 这里是Pipe原理的图示:

  10. FineReader Mac如何设置参数让导出为DOCX/RTF/ODT格式

    Mac版ABBYY FineReader OCR文字识别软件识别文档之后,可以将已识别的文本保存到文件中,还可以通过电子邮件发送输出格式受FineReader支持的已识别文本,了解了ABBYY Fin ...