首页 > 代码库 > 利用Node.js实现模拟Session验证的登陆
利用Node.js实现模拟Session验证的登陆
1.身份验证和用户登陆
在一般的Web应用上,如果要实现用户登陆,最常用,也是最简单的方法就是使用Session,基本的思路是在Session中保留一些用户身份信息,然后每次在Session中取,如果信息不正确或不存在,那么身份验证失败,正确则成功。
Session和Cookie是两个很相似的东西,都是字符串,只不过Session是保存在服务器上的,而Cookie是保存在本地的,所以Cookie是不能用作身份验证的。Session故名思议,肯定和客户端与服务器间建立的会话相关,Session的工作过程也是如此,每当客户端和服务器上的一个站点建立了会话后,就会生成Session在服务器上,只不过Session里有没有相关的信息,就要看用户的提交操作了。
Session的区分是按照服务器给的SessionID来进行的,不同种类的服务器SessionID不同,以下列举几种SessionID:
①使用ASP.NET的IIS服务器:ASP.NET_SessionId
②使用Java的Tomcat服务器:JSESSIONID
利用Session进行的身份验证过程:
开启了Session支持的服务器在客户端开始会话的时候,生成一个SessionID,并且在响应(Response)头(Headers)中的Set-Cookie字段设置一个Cookie,Cookie的内容就是SessionID和Cookie的路径(path),在后继的会话中,客户端浏览器会自动附上Set-Cookie中的SessionID以向服务器表明身份,服务器根据SessionID在自己的存储中查找相关用户信息,并完成验证过程。
那么用户登陆的过程也就是用户对服务器提交用户名、密码等信息,获取SessionID的过程。
2.如何模拟实现用户登陆
3.Node.js中的具体实现
我在Node.js中使用了request包来简化请求操作,当然,用原生的http包也是没有问题的,为了开发效率,还是采用一些npm包为好,话不多说,先上代码
request( { url: 'http://222.24.3.7:8080/opac_two/include/login_app.jsp', //请求的URL method: 'POST', //POST方式请求 encoding: null, //由于Node默认是UTF-8,而图书馆用的GB2312,所以不进行转码 headers: { //请求头的设置 ContentType: 'application/x-www-form-urlencoded' }, form: { //请求体,参数 login_type: 'barcode', barcode: username, //提交用户名 password: password, //提交密码 _: '' //其他参数 } }, function (err, res, body) { //接收回调 body = iconv.decode(body, "GB2312"); //转码 //console.log(body); session = res.headers['set-cookie']; //获取set-cookie字段值 //console.log(session); if (body == 'ok') { callback({Result: true, Session: session}); } else { callback(false); //回调 } } );上面的代码是一个用户登陆的请求示例,采用了URL转码的参数提交方式,提交用户名和密码给服务器,服务器是西邮图书馆的借阅信息查询站点。其中3~15行为请求的构建,包含请求头、请求体(参数),具体的写法请参见request的官方文档。
后面的回调函数用于接收服务器回传的响应,其中就有我们需要的SessionID。
接着,我们来看如何带上SessionID进行后继的请求
request( { uri: 'http://222.24.3.7:8080/opac_two/reader/jieshulishi.jsp', //构建请求 encoding: null, //不转码 headers: { Cookie: session //这里是关键,设置Cookie为之前请求到的以Cookie形式呈现的SessionID } }, function (err, res, body) { //获取响应即可 if (err) { callback('Server Error'); } });上面代码中,最关键的就是6~8行中,对请求头的设置,也是对Cookie的设置,这里必须设置为传递用户名及密码进行登陆后返回的内容为SessionID的Cookie,无论是什么网站,只要采用Session进行身份验证,就可以使用这种方式从程序中,模拟用户数据的提交,从而获取需要身份验证页面的信息。