session-cookie 和token登录验证

  最近研究了下基于token的身份验证,并将这种机制整合在个人项目中。现在很多网站的认证方式都从传统的seesion+cookie转向token校验。对比传统的校验方式,token确实有更好的扩展性与安全性。
  
  传统的session+cookie身份验证
  
  由于HTTP是无状态的,它并不记录用户的身份。用户将账号与密码发送给服务器后,后台通过校验,但是并没有记录状态,于是下一次用户的请求仍然需要校验身份。为了解决这一问题,需要在服务端生成一条包含用户身份的记录,也就是session,再将这条记录发送给用户并存储在用户本地,即cookie。接下来用户的请求都会带上这条cookie,若客户端的cookie与服务端的session能对应上,则说明用户身份验证通过。
  
  token身份校验
  
  流程大致如下:
  
  第一次请求时,用户发送账号与密码
  
  后台校验通过,则会生成一个有时效性的token,再将此token发送给用户
  
  用户获得token后,将此token存储在本地,一般存储在localstorage或cookie
  
  之后的每次请求都会将此token添加在请求头里,所有需要校验身份的接口都会被校验token,若token解析后的数据包含用户身份信息,则身份验证通过。
  
  对比传统的校验方式,token校验有如下优势:
  
  在基于token的认证,token通过请求头传输,而不是把认证信息存储在session或者cookie中。这意味着无状态。你可以从任意一种可以发送HTTP请求的终端向服务器发送请求。
  
  可以避免CSRF攻击
  
  当在应用中进行 session的读,写或者删除操作时,会有一个文件操作发生在操作系统的temp 文件夹下,至少在第一次时。假设有多台服务器并且 session 在第一台服务上创建。当你再次发送请求并且这个请求落在另一台服务器上,session 信息并不存在并且会获得一个“未认证”的响应。我知道,你可以通过一个粘性 session 解决这个问题。然而,在基于 token 的认证中,这个问题很自然就被解决了。没有粘性 session 的问题,因为在每个发送到服务器的请求中这个请求的 token 都会被拦截。
  
  下面介绍一下利用node+jwt(jwt教程)搭建简易的token身份校验
  
  示例
  
  当用户第一次登录时,提交账号与密码至服务器,服务器校验通过,则生成对应的token,代码如下:
  
  const fs = require(‘fs‘);
  
  const path = require(‘path‘);
  
  const jwt = require(‘jsonwebtoken‘);
  
  //生成token的方法
  
  function generateToken(data){
  
  let created = Math.floor(Date.now() / 1000);
  
  let cert = fs.readFileSync(path.join(__dirname, ‘../config/pri.pem‘));//私钥
  
  let token = jwt.sign({
  
  data,
  
  exp: created + 3600 * 24
  
  }, cert, {algorithm: ‘RS256‘});
  
  return token;
  
  }
  
  //登录接口
  
  router.post(‘/oa/login‘, async (ctx, next) => {
  
  let data = ctx.request.body;
  
  let {name, password} = data;
  
  let sql = ‘SELECT uid FROM t_user WHERE name=? and password=? and is_delete=0‘, value = [name, md5(password)];
  
  await db.query(sql, value).then(res => {
  
  if (res && res.length > 0) {
  
  let val = res[0];
  
  let uid = val[‘uid‘];
  
  let token = generateToken({uid});
  
  ctx.body = {
  
  ...Tips[0], data: {token}
  
  }
  
  } else {
  
  ctx.body www.michenggw.com/= Tips[1006];
  
  }
  
  }).catch(e =www.yigouyule2.cn> {
  
  ctx.body = www.mhylpt.com/ Tips[1002];
  
  });
  
  });
  
  用户通过校验将获取到的token存放在本地:
  
  ?
  
  1
  
  store.set(‘loginedtoken‘,token);//store为插件
  
  之后客户端请求需要验证身份的接口,都会将token放在请求头里传递给服务端:

  service.interceptors.request.use(config => {
  
  let params = config.params |www.gcyl158.com| {};
  
  let loginedtoken = store.get(‘loginedtoken‘);
  
  let time = Date.now(www.gcyL157.com);
  
  let {headers} = config;
  
  headers = {.www.feifanyule.cn/..headers,loginedtoken};
  
  params = {...params,_:time};
  
  config = {...config,params,headers};
  
  return config;
  
  }, error => {
  
  Promise.reject(error);
  
  })
  
  服务端对所有需要登录的接口均拦截token并校验合法性。
  
  ?
  
  1
  
  2
  
  3
  
  4
  
  5
  
  6
  
  7
  
  8
  
  9
  
  10
  
  11
  
  12
  
  13
  
  14
  
  15
  
  16
  
  17
  
  18
  
  19
  
  20
  
  21
  
  22
  
  23
  
  24
  
  25
  
  26
  
  27
  
  28
  
  29
  
  30
  
  31
  
  32
  
  33
  
  34
  
  35
  
  36
  
  function verifyToken(token){
  
  let cert = fs.readFileSync(path.join(__dirname, ‘../config/pub.pem‘));//公钥
  
  try{
  
  let result = jwt.verify(token, cert, {algorithms: [‘RS256‘]}) || {};
  
  let {exp = 0} = result,current = Math.floor(Date.now()/1000);
  
  if(current <= exp){
  
  res = result.data || {};
  
  }
  
  }catch(e){
  
  }
  
  return res;
  
  }
  
  app.use(async(ctx, next) => {
  
  let {url = ‘‘} = ctx;
  
  if(url.indexOf(‘/user/‘) > -1){//需要校验登录态
  
  let header = ctx.request.header;
  
  let {loginedtoken} = header;
  
  if (loginedtoken) {
  
  let result = verifyToken(loginedtoken);
  
  let {uid} = result;
  
  if(uid){
  
  ctx.state = {uid};
  
  await next();
  
  }else{
  
  return ctx.body = Tips[1005];
  
  }
  
  } else {
  
  return ctx.body = Tips[1005];
  
  }
  
  }else{
  
  await next();
  
  }
  
  });
  
  本示例使用的公钥与私钥可自己生成,操作如下:
  
  打开命令行工具,输入openssl,打开openssl;
  
  生成私钥:genrsa -out rsa_private_key.pem 2048
  
  生成公钥: rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

原文地址:https://www.cnblogs.com/qwangxiao/p/10057156.html

时间: 2024-07-31 12:09:52

session-cookie 和token登录验证的相关文章

iOS UIWebView 通过 cookie 完成自动登录验证

一些说明: 通过UIWebView登录后,会自动得到web服务器设置的cookie包括服务器中的seesionid. cookie不会自动保存在app里面,需要通过设置才能在下次启动app时获取. 自动登录,需要设置header,才能将cookie带给web服务器. 自动登录,需要web服务器端进行cookie验证方可登录. 实现流程: 1. 做好Sign in页面后,通过get或post递交表单给web服务器,可以通过下面的代码遍历得到的cookie. NSHTTPCookieStorage

requests保持登录session ,cookie 和 token

一.request提供了一个一个叫做session的类,来实现客户端和服务端的会话保持 # coding:utf-8 import requests url = "https://passport.cnblogs.com/user/signin" headers = { 头部信息已省略 } payload = {"input1":"xxx", "input2":"xxx", "remember&q

Asp.net MVC访问母版页中嵌套的iframe页面时,如果session或cookie过期,登录验证超时怎样自动跳转到登录页

一般登录验证的过滤器中,使用验证过滤器的Redirect方法,将请求重定向到指定的URL.但是如果我们要访问的页面是一个嵌套在母版页中的iframe页面时,这种重定向只会对iframe页面凑效,也就是会将iframe也重定向到登录页,这样就有违我们的目的了.所以我就尝试了很多方法来实现让整个页面重定向到登录页的目标,接下里我就来分享一下我的心路历程~~如果想看解决方法,可以直接拉到最后,忽略我的啰啰嗦嗦~~ 首先,我尝试了替换掉Redirect,改用了Write方法,意在将指定字符串写入HTTP

使用session插件并且实现登录验证

var express = require('express'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var session = require('express-session'); var swig = require('swig'); var user = require('./modules/user'); var app = express(); /

token登录验证机制

最近在vue-cli项目实现登录的过程中用到了token验证,在此总结如下 1. 登录时,客户端通过用户名与密码请求登录 2. 服务端收到请求去验证用户名与密码 3. 验证通过,服务端会签发一个Token,再把这个Token以响应发给客户端. 4. 客户端收到Token,存储到本地,如Cookie,SessionStorage,LocalStorage.我们是存在cookie 5. 客户端每次像服务器请求API接口时候,都要带上Token. 6. 客户端每次跳转路由的时候也要验证Token登录态

cookie和session实现登录验证

回话技术,比如在做登录功能的时候,需要配合是用存储在客户端的cookie信息,以及存储在服务端的session来实现登录功能.在cookie中保存了用户的信息,特别是一个特殊的令牌信息,当用户拿着这个特殊的令牌来访问网站的时候,网站会从cookie中获取这个特殊令牌去数据库session中去查询是否有这个对应的令牌的信息,如果有则验证成功,就可以把用户的信息返回给客户端了,如果验证失败则提示用户没有登录等等提示信息. cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,

Cookie &amp;amp;&amp;amp; Session &amp;amp;&amp;amp; Token

Cookies Cookie的由来: HTTP 本身是一个无状态的 request/response 协议. server接收一个来自client的request, 处理完以后返回一个response. 可是这个过程中, server差点儿没有什么信息能够用来判定是哪个client(用户)发来的request, 也无法记录用户的请求顺序. Cookie是眼下识别用户.实现持久会话最好的方式.Cookie通常会跟User-Agent.Referer.X-Forwarded-For,JS等技术共同使

Http无状态?Session Cookie Token

HTTP无状态? HTTP无状态协议,是指协议对于交互性场景没有记忆能力. 在点击一个纯的html网页,请求获取服务器的html文件资源时,每次http请求都会返回同样的信息,因为这个是没有交互的每次请求都是相互独立的,第一个请求和第二个请求也没有先后顺序,返回处理哪个,结果都是同样的资源页面,因为这种场景是无交互的,无论是什么人请求那个资源,服务器都是一股脑的返回那个相同的文件. 但是对于涉及到动态交互的场景,就显得很尴尬了.何为交互?有来又有往,和上面的不一样,上面无论是谁请求同一个地址都是

【转】Session Cookie Token的区别

Cookie cookie 是一个非常具体的东西,指的就是浏览器里面能永久存储的一种数据,仅仅是浏览器实现的一种数据存储功能. cookie由服务器生成,发送给浏览器,浏览器把cookie以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器.由于cookie是存在客户端上的,所以浏览器加入了一些限制确保cookie不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的cookie数量是有限的. Session session 从字面上讲,就是会话.这个就类似