提到登录验证,大家肯定能想到的就是12306的验证码了吧。12306为了防止刷票,可以说是煞费苦心,验证码也越来越难识别,最终即使是人也可能识别不了了。
今天,小编就给大家说一下node如何实现图片验证码,以及使用token验证登录。学习本文你将学到:
2.使用jsonwebtoken实现登录验证
一、图片验证码生成(最后有全部代码)
第三步,我们要将这四位数存起来,以便用户返回数据时做对比。
那么存到哪里呢?很明显为了区分用户,存到session最为稳妥。
login.tsx
提到登录验证,大家肯定能想到的就是12306的验证码了吧。12306为了防止刷票,可以说是煞费苦心,验证码也越来越难识别,最终即使是人也可能识别不了了。
今天,小编就给大家说一下node如何实现图片验证码,以及使用token验证登录。学习本文你将学到:
2.使用jsonwebtoken实现登录验证
第三步,我们要将这四位数存起来,以便用户返回数据时做对比。
那么存到哪里呢?很明显为了区分用户,存到session最为稳妥。
login.tsx
页面是这样的
我们需要通过服务器给一张验证图片。
router/index.js 添加如下代码
captcha方法是生成一张含四位数字的图片,然后将图片保存到session中。
将此方法在 router/index.js 中引用
也就是说我们访问localhost:3000/captcha就会返回一张图片。
有了这个连接后我们就可以通过图片的src属性拿到该图片,但是当点击图片的时候要重新刷新,所以我们需要给图片添加一个点击刷新事件。将下面代码插入到login.tsx中
img标签也变成了
此时login.tsx全部代码:
这样只要点击img,就会随机生成一个hash,然后就会调用新的图片出来。
接着我们进行登录验证。
拿到用户的用户名信息,密码以及验证码一次对比,最后返回登录是否成功数据。
当用户登陆成功以后,下次登录就不需要再次登录了,以往的方法可以选则session或者cookie的方式,在这里我们使用token。因为现在已经实现了前后端分离开发,我们更倾向于构建单页面配合ajax构建应用。而token最适合这种开发模式不过了。
token是一串经过加密的字符串,登录成功以后返回给用户保存,然后用户在请求接口时,都带这个token。所以我们需要对token进行加密。
Json Web Token就是专门解决这个问题的,原理就不做详解了,其实就是按照一定的方式得到一个字符串,然后在通过某种方式解开。
我们要做的第一步就是
第二步:用户拿到token后应该把token存到本地。
第三步:需要写一个中间层,每次用户请求时我们验证用户携带的token是否正确。正确返回数据,不正确返回警告。 用户每次请求数据的时候要在header里把token带上。
第一步:还是controller/login.js
module.exports = Login
这次在loginer方法里面我们加入设置token,并返回给用户。setToken方法是设置token的方法。
第二步:用户拿到后保存。
在login.tsx就变成如下
在sbumit方法里我们将token放到了sessonstorage里面。
第三步:设置中间件每次请求接口时,验证token,如果解析成功加入到请求头里面。
./middleware/token.js
if(token) {
//存在token,解析token
jwt.verify(token,'cxh',function(err,decoded) {
if(err) {
// 解析失败直接返回失败警告
return res.json({success:false,msg:'token<a href="https://www.jb51.cc/tag/cuowu/" target="_blank" class="keywords">错误</a>'})
}else {
//解析成功加入请求信息,继续<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a>后面<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>
req.userInfo = decoded;
next()
}
})
}else {
return res.status(<a href="https://www.jb51.cc/tag/403/" target="_blank" class="keywords">403</a>).send({success:false,msg:"没有token"})
}
}
setToken(name,time,data) {
var jwtSecret = name;
var token = jwt.sign(data,jwtSecret,{
expiresIn: time
})
return token;
}
}
module.exports = Tokens
testToken方法是验证token,setToken是设置token方法
假如没有登录请求是这样的
在 router/index.js
)
}
}
export default Home
当调用getList时,如果此时没有登录res.data.success就会为false,则跳到登录页。
node.js
app.js
var app = express();
// view engine setup
app.set('views',path.join(dirname,'views'));
// app.set('view engine','jade');
app.engine('html',ejs.express);
app.set('view engine','html');
app.use(session({
secret:"dabao",resave:false,saveUninitialized:true,cookie:{}
}));
// uncomment after placing your favicon in /public
//app.use(favicon(path.join(dirname,'public','favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser({limit: 5000000}));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(dirname,'')));
app.use('/',index);
// catch 404 and forward to error handler
app.use(function(req,next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
// error handler
app.use(function(err,req,next) {
// set locals,only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
module.exports = app;
index.js
controller/login.js
middleware/token.js
if(token) {
jwt.verify(token,decoded) {
if(err) {
return res.json({success:false,msg:'token<a href="https://www.jb51.cc/tag/cuowu/" target="_blank" class="keywords">错误</a>'})
}else {
req.userInfo = decoded;
next()
}
})
}else {
return res.status(<a href="https://www.jb51.cc/tag/403/" target="_blank" class="keywords">403</a>).send({success:false,{
expiresIn: time
})
return token;
}
}
module.exports = Tokens
react部分
login.tsx
home.js 获取列表信息
)
}
}
export default Home
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。
原文链接:https://www.f2er.com/nodejs/37056.html