JWT是Auth0提出的通过对JSON进行加密签名来实现授权验证的方案,就是登陆成功后将相关信息组成json对象,然后对这个对象进行某中方式的加密,返回给客户端,客户端在下次请求时带上这个token,服务端再收到请求时校验token合法性,其实也就是在校验请求的合法性。
JWT对象通常由三部分构成:
Headers: 包括类别(typ)、加密算法(alg)
{ "alg": "HS256", "typ": "JWT" }
Claims :包括需要传递的用户信息
{ "sub": "1234567890", "name": "John Doe", "admin": true }
Signature: 根据alg算法与私有秘钥进行加密得到的签名字串, 这一段是最重要的敏感信息,只能在服务端解密;
HMACSHA256( base64UrlEncode(Headers) + "." + base64UrlEncode(Claims), SECREATE_KEY )
编码之后的JWT看起来是这样的一串字符:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
nodejs+express+jwt-simple
auth.js
let jwt = require('jwt-simple'); let secret = "wangyy"; let time = 10; module.exports = { /* *检验token合法性 */ validate:function(req,res,next){ let token = req.body.token||req.headers["xssToken"]; if(token){ let decodeToken = null; try { //防止假冒token解析報錯 decodeToken = jwt.decode(token,secret,'HS256'); } catch (err) { res.status(401).send("非法访问"); return; } let exp = decodeToken.exp; if(!exp){ res.status(401).send("非法访问"); } let now = new Date().getTime(); if(exp>(now+time*60*1000)){ res.send({code:'002',"errorMsg":"授权超时"}) } next(); }else{ res.status(401).send("非法访问"); } }, /* 生成token*/ makeToken(){ let Token = null; let payload = { time:new Date().getTime(), exp:this.makeExp(time) } Token = jwt.encode(payload,secret,HS256) return Token; }, /*生成token过期时间*/ makeExp:function(time){ let stam = time601000; } }
server.js
let express = require("express"); let app = express(); let bodyParser = require('body-parser'); let auth = require('./lib/auth.js'); let chalk = require('chalk'); app.use(bodyParser.json()); app.post('/login',function(req,res,next){ let Token = auth.makeToken(); res.json({result:"success",token:Token},200) }); app.use('*',[auth.validate],function(req,res,next){ res.send('success'); }); app.listen('9999')
上面只是一个简单的token生成和校验,如果有需要可以根据实际需要进行逻辑处理
四.OAuth(开放授权)
OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容,为了保护用户数据的安全和隐私,第三方网站访问用户数据前都需要显式的向用户征求授权。我们常见的提供OAuth认证服务的厂商有支付宝,QQ,微信。
OAuth协议又有1.0和2.0两个版本。相比较1.0版,2.0版整个授权验证流程更简单更安全,也是目前最主要的用户身份验证和授权方式。
下面是一张auth2.0的流程图:
从图中我们可以看出,auth2.0流程分为六布(我们就以csdn登陆为例):
第一步. 向用户请求授权,现在很多的网站在登陆的时候都有第三方登陆的入口,当我们点击等第三方入口时,第三方授权服务会引导我们进入第三方登陆授权页面。
通过第三方请求授权页面的浏览器地址栏地址可以看出,
这里的地址里面的%是浏览器强制编码后的显示我们可以使用decodeURIComponent进行解码,解码后是这样:
这个url地址我们可以看见Auth2.0常见的几个参数:
response_type,返回类型
client_id,第三方应用id,由授权服务器(qq)在第三方应用提交时颁发给第三方应用。
redirect_uri,登陆成功重定向页面
oauth_provider,第三方授权提供方
state,由第三方应用给出的随机码
第二步. 返回用户凭证(code),并返回一个凭证(code),当用户点击授权并登陆后,授权服务器将生成一个用户凭证(code)。这个用户凭证会附加在重定向的地址redirect_uri的后面
第3步. 请求授权服务器授权: