3.实现会话身份验证

本文介绍了一种使用Node.js的crypto模块生成安全密码的方法,并通过express、body-parser、cookie-parser和express-session中间件实现会话验证。文章详细展示了如何在用户登录时加密密码,如何在会话中存储用户信息,以及如何在受限制的路由中检查会话的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现会话验证

 1 var express=require('express');
 2 var bodyParser=require('body-parser');
 3 var cookieParser=require('cookie-parser');
 4 var session=require('express-session');
 5 var crypto=require('crypto');
 6 // 生成安全密码
 7 function hashPW(pwd){
 8     return crypto.createHash('sha256').update(pwd).
 9     digest('base64').toString();
10 }
11 var app=express();
12 // app.use(bodyParser());
13 app.use(bodyParser.urlencoded({
14   extended: true
15 }));
16 app.use(bodyParser.json());
17 app.use(cookieParser('MAGICString'));
18 // app.use(session());
19 app.use(session({
20     secret: 'weizai',
21     resave: true,
22     saveUninitialized: true
23 }));
24 app.get('/restricted',function(req,res){
25     if(req.session.user){
26         res.send('<h2>'+req.session.success+'</h2>'+
27             '<p>You have entered the restricted section</p><br>'+
28             '<a href="/logout">logout</a>'
29             );
30     }else{
31         req.session.error='Access denied';
32         res.redirect('/login');
33     }
34 });
35 app.get('/logout',function(req,res){
36     req.session.destroy(function(){
37         res.redirect('/login');
38     })
39 })
40 app.get('/login',function(req,res){
41     var response='<form method="POST">'+
42     '<input type="text" name="username"><br>'+
43     '<input type="password" name="password"><br>'+
44     '<input type="submit" value="Submit"></form>';
45     if(req.session.user){
46         res.redirect('/restricted');
47     }else if(req.session.error){
48         response+='<h2>'+req.session.error+'</h2>';
49     }
50     res.type('html');
51     res.send(response);
52 })
53 app.post('/login',function(req,res){
54     // var user={name:req.body.username,password:hashPW("myPass")};
55     var user={name:'weizai',password:hashPW("myPass")};
56     if(user.password==hashPW(req.body.password.toString())){
57         // 移除并创建新的req.session()会话
58         req.session.regenerate(function(){
59             req.session.user=user;
60             req.session.seccess='Authenticated as '+user.name;
61             res.redirect('/restricted');
62         })
63     }else{
64        req.session.regenerate(function(){
65             req.session.error='Authentication failed';
66             res.redirect('/restricted');           
67        });
68        // res.redirect('/login');
69     }    
70 });
71 app.listen(8081);

1.使用crypto模块生成安全的密码实现会话验证

1.利用hashPW()函数对密码加密,使用body-parser,cookieParser和session中间件

55行 模拟数据库得到一个user对象并把储存的密码散列值与请求正文中的密码散列值比较

58-61行 创建会话。regenerate()函数用来重新生成一个新的会话,传给regenerate()的回调函数设置会话的session.user和session.success属性。

验证失败,只会为会话session.error属性

40-51行 /login路由显示一个基本的登录获取证书。若session.error被设置,它也会显示在登录页面上。

24-33行 /restricted路由检查会话,看是否是有效的用户。是的话显示成功信息,否则session.error被设置,响应被重新定向到/login

35-38行 /logout路由在会话上调用destroy()方法删除身份验证。

方法说明
regenerate([callback])移除并创建一个词新的req.session对象,让你重置会话
destroy([callback])移除req.session对象
save([callback])保存会话数据
touch([callback])为会话重置maxAge计数
cookie指定把绘画链接到浏览器的cookie对象

转载于:https://www.cnblogs.com/weizaiyes/p/6062055.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值