<!--
和java一样,token的生成/存储有多种方式,下面我们重点讲一种方式:
即使用:jwt ; 下载依赖npm install jsonwebtoken --save
(ps:因为前后端分离常常会涉及到跨域,前面我已经讲过了。引入cors等操作)。
为了方便起见 我将jwt的使用方式单独封装成js文件
// 引入模块依赖
var jwt = require('jsonwebtoken');
var secretOrPrivateKey="jwtSecret",//密钥,一般很复杂,可以存服务器本地;然后获取;
duringTime={expiresIn:60*30};// 1小时过期;
var Jwt={
setJwt:function (content) {
var token=jwt.sign(content, secretOrPrivateKey,duringTime);
return token
},
getJwt:function (token,callback) {
jwt.verify(token,secretOrPrivateKey, function(err, decode){
callback(err,decode);
});
}
};
module.exports = Jwt;
接下来使用:
//一:获取并鉴权。我习惯在app.js中进行token鉴权
app.use(function (request,response,next) {
if(request.url=='/routers/load/doLogin'||request.url=='/routers/load/doRegist'){//可以更多。不列举
next();
}else{
var token=request.body.token;
if(token&&token!=''){
//验证token
Jwt.getJwt(token,function (err,decode) {
if (err) {
//时间失效的时候 || 伪造的token
response.send({'msgCode':-1});
} else {
//获取通行权限
next();
}
})
}else{
//token不存在
response.send({"msgCode":-1});
}
}
});
//二:生成并传递
我个人喜欢和java后端一样,将路由和逻辑处理分开,新建一个service文件夹;这样能让路由看的干净,业务处理都在service层
controller层--routers路由
var express=require("express");
var routers=express.Router();
var userService=require("../../services/userService");
routers.post("/doLogin",function (request,response) {
var data={
username:request.body.username,
password:request.body.password
};
userService.findUser(data,function (res) {
response.send(res)
});
});
routers.post("/doRegist",function (request,response) {
var data={
username:request.body.username,
password:request.body.password
};
userService.addUser(data,function (res) {
response.send(res)
});
});
module.exports=routers;
service层--会在这里生成token。
var dbName='dbUser';
var collectionName='user';
var connect=require("../myUtils/dbUtils/connet");
var sortData={};
var Jwt=require("../myUtils/jwtUtils/jwt");
var userService={
findUser:function (data,callback) {
connect.find(dbName,collectionName,data,sortData,function (res) {
if(res.length>0){
var token=Jwt.setJwt({username:data.username});
callback({
msgCode:0,
message:'登陆成功!',
token:token
});
}else{
callback({
msgCode:-1,
message:'登陆失败!用户名或密码错误'
});
}
})
},
addUser:function (data,callback) {
connect.find(dbName,collectionName,data,sortData,function (res) {
if(res.length>0){
callback({
msgCode:-1,
message:"注册失败!用户名已经注册"
})
}else{
var token=Jwt.setJwt({username:data.username});
connect.add(dbName,collectionName,data,function (res) {
if(res.result.n>=1){
callback({
msgCode:0,
message:"注册成功!",
token:token
});
}else{
callback({
msgCode:-1,
message:"异常错误,注册失败!"
});
}
})
}
})
}
};
module.exports=userService;
最后前端需要做的是,在登录和注册页面接受传过来的token,存至本地(localStorage等),然后再其他页面获取并向服务器请求数据时携带即可
-->
可参见:跃焱邵隼