广告
返回顶部
首页 > 资讯 > 精选 >Token登陆验证机制怎么实现
  • 143
分享到

Token登陆验证机制怎么实现

2023-06-21 22:06:10 143人浏览 八月长安
摘要

这篇文章主要介绍“Token登陆验证机制怎么实现”,在日常操作中,相信很多人在Token登陆验证机制怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Token登陆验证机制怎么实现”的疑惑有所帮助!接下来

这篇文章主要介绍“Token登陆验证机制怎么实现”,在日常操作中,相信很多人在Token登陆验证机制怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Token登陆验证机制怎么实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

session简介

做过web开发程序员应该对Session都比较熟悉,Session是一块保存在服务器端的内存空间,一般用于保存用户的会话信息。

Token登陆验证机制怎么实现

用户通过用户名和密码登陆成功之后,服务器端程序会在服务器端开辟一块Session内存空间并将用户的信息存入这块空间,同时服务器会在cookie中写入一个Session_id的值,这个值用于标识这个内存空间。

下次用户再来访问的话会带着这个cookie中的session_id,服务器拿着这个id去寻找对应的session,如果session中已经有了这个用户的登陆信息,则说明用户已经登陆过了。

使用Session保持会话信息使用起来非常简单,技术也非常成熟。但是也存在下面的几个问题:

  • 服务器压力大:通常Session是存储在内存中的,每个用户通过认证之后都会将session数据保存在服务器的内存中,而当用户量增大时,服务器的压力增大。

  • Session共享:现在很多应用都是分布式集群,需要我们做额外的操作进行Session共享;

  • CSRF跨站伪造请求攻击:Session机制是基于浏览器端的cookie的,cookie如果被截获,用户就会很容易受到跨站请求伪造的攻击。

基于token的认证

基于token的认证机制将认证信息返回给客户端并存储。下次访问其他页面,需要从客户端传递认证信息回服务端。简单的流程如下:

  • 客户端使用用户名跟密码请求登录;

  • 服务端收到请求,去验证用户名与密码;

  • 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端;

  • 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里;

  • 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token;

  • 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据;

基于token的验证机制,有以下的优点:

  • 支持跨域访问,将token置于请求头中,而cookie是不支持跨域访问的;

  • 无状态化,服务端无需存储token,只需要验证token信息是否正确即可,而session需要在服务端存储,一般是通过cookie中的sessionID在服务端查找对应的session;

  • 无需绑定到一个特殊的身份验证方案(传统的用户名密码登陆),只需要生成的token是符合我们预期设定的即可;

  • 更适用于移动端(AndroidiOS小程序等等),像这种原生平台不支持cookie,比如说微信小程序,每一次请求都是一次会话,当然我们可以每次去手动为他添加cookie,详情请查看博主另一篇博客;

  • 避免CSRF跨站伪造攻击,还是因为不依赖cookie;

缺点的话一个就是相比较于传统的session登陆机制实现起来略微复杂一点,另外一个比较大的缺点是由于服务器不保存 token,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 token 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。

退出登陆的话,只要前端清除token信息即可。

基于Jwt的token认证实现

JWT(JSON WEB Token)就是基于token认证的代表,这边就用JWT为列来介绍基于token的认证机制。

需要引入JWT的依赖

<dependency>  <groupId>com.auth0</groupId>  <artifactId>java-jwt</artifactId>  <version>3.8.2</version></dependency>

生成token和验证token的工具类如下:

public class JWTTokenUtil {    //设置过期时间    private static final long EXPIRE_DATE=30*60*100000;    //token秘钥    private static final String TOKEN_SECRET = "ZCfasfhuaUUHufguGuwu2020BQWE";    public static String token (String username,String passWord){        String token = "";        try {            //过期时间            Date date = new Date(System.currentTimeMillis()+EXPIRE_DATE);            //秘钥及加密算法            AlGorithm algorithm = Algorithm.HMac256(TOKEN_SECRET);            //设置头部信息            Map<String,Object> header = new HashMap<>();            header.put("typ","JWT");            header.put("alg","HS256");            //携带username,password信息,生成签名            token = JWT.create()                    .withHeader(header)                    .withClaim("username",username)                    .withClaim("password",password).withExpiresAt(date)                    .sign(algorithm);        }catch (Exception e){            e.printStackTrace();            return  null;        }        return token;    }    public static boolean verify(String token){                try {            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);            JWTVerifier verifier = JWT.require(algorithm).build();            DecodedJWT jwt = verifier.verify(token);            return true;        }catch (Exception e){            e.printStackTrace();            return  false;        }    }    public static void main(String[] args) {        String username ="name1";        String password = "pw1";        //注意,一般不会把密码等私密信息放在payload中,这边只是举个列子        String token = token(username,password);        System.out.println(token);        boolean b = verify(token);        System.out.println(b);    }}

执行结果如下:

Connected to the target VM, address: '127.0.0.1:11838', transport: 'Socket'eyJhbGCiOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXNzd29yZCI6IjEyMyIsImV4cCI6MTU5NzM5Nzc0OCwidXNlcm5hbWUiOiJ6aGFuZ3NhbiJ9.LI5S_nX-YcQtExI9UtKiP8FPqpQW_ccaws2coLzyOS0true

关于DecodedJWT这个类,大家可以重点看下,里面包含了解码后的用户信息。

JWT的使用说明

客户端收到服务器返回的 JWT,可以储存在 Cookie 里面,也可以储存在 localStorage。

此后,客户端每次与服务器通信,都要带上这个 JWT。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 Http 请求的头信息Authorization字段里面。

Authorization: Bearer <token>

另一种做法是,跨域的时候,JWT 就放在 POST 请求的数据体里面。

JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。

为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 https 协议传输。(或者是对JWT在前后端之间进行加密之后在传输)

关于JWT的一个问题

上面生成JWT token的过程关键点就是密钥,假如这个密钥泄露了,那是不是就可以伪造token了。

还有就是生产环境的密钥值,开发的程序员大概率是知道的,怎么防止程序要监守自盗,伪造token值呢?希望有经验的大佬指教下。

//token秘钥private static final String TOKEN_SECRET = "ZCfasfhuaUUHufguGuwu2020BQWE";

关于上面的问题,给出一个简单易懂的方案~

jwt 来生成token,还有一个玩法,用户登录时,生成token的 SecreTKEy 是一个随机数,也就是说每个用户,每次登录时jwt SecretKey 是随机数,并保存到缓存,key是登录账户,(当然了,分布式缓存的话,就用Redissqlserver缓存等等),总之,客户端访问接口是,header 要带登录账户,和token,服务端拿到登录账号,到缓存去捞相应的SecretKey ,然后再进行token校验。可以防伪造token了(这个方案在一定程度上能防止伪造,但是不能防止token泄露被劫持)。

到此,关于“Token登陆验证机制怎么实现”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: Token登陆验证机制怎么实现

本文链接: https://www.lsjlt.com/news/301136.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Token登陆验证机制怎么实现
    这篇文章主要介绍“Token登陆验证机制怎么实现”,在日常操作中,相信很多人在Token登陆验证机制怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Token登陆验证机制怎么实现”的疑惑有所帮助!接下来...
    99+
    2023-06-21
  • Token登陆验证机制的原理及实现
    session简介 做过Web开发的程序员应该对Session都比较熟悉,Session是一块保存在服务器端的内存空间,一般用于保存用户的会话信息。 用户通过用户名和密码登陆成功之...
    99+
    2022-11-12
  • go gin+token验证是怎么实现登陆验证
    本篇文章为大家展示了go gin+token验证是怎么实现登陆验证,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1.准备go get github.com/dgrija...
    99+
    2023-06-22
  • gogin+token(JWT)验证实现登陆验证
    1.准备 go get github.com/dgrijalva/jwt-go go get github.com/gin-gonic/gin  2.代码 package ...
    99+
    2022-11-12
  • 基于redis实现token验证用户是否登陆
    基于项目需求, 我们要实现一个基于redis实现token登录验证,该如何实现呢: 后端实现: 1.引入redis相关的依赖 <dependency> <groupId>org...
    99+
    2022-10-18
  • VUE实现token登录验证
    本文实例为大家分享了VUE实现token登录验证的具体代码,供大家参考,具体内容如下 实现这个登录功能的过程真是一波三折,中途出现了bug,整了两三天才解决了问题,心力交瘁,简直一个...
    99+
    2022-11-12
  • javascript 实现登陆验证
    随着互联网的普及,各种网站和应用对用户登陆的需求也越来越多。而随之而来的问题是用户的账号和个人信息的安全性变得更加关键。因此,为确保用户账号的安全,对登陆的验证也就变得非常重要。本文将介绍如何用javascript实现一个简单的登陆验证功能...
    99+
    2023-05-17
  • nodejs怎么实现登陆验证功能
    这篇文章主要介绍“nodejs怎么实现登陆验证功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“nodejs怎么实现登陆验证功能”文章能帮助大家解决问题。登陆验证需要提交数据,一种使用form表单提...
    99+
    2023-06-30
  • php token验证怎么实现
    本文操作环境:Windows7系统、PHP7.1版,DELL G3电脑。php token验证怎么实现?php token使用与验证示例【测试可用】本文实例讲述了php token使用与验证。分享给大家供大家参考,具体如下:一、token功...
    99+
    2020-12-25
    php token
  • Java如何实现Token登录验证
    这篇文章主要介绍“Java如何实现Token登录验证”,在日常操作中,相信很多人在Java如何实现Token登录验证问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java如何实现Token登录验证”的疑惑有所...
    99+
    2023-07-05
  • 怎么用vue实现登录注册及token验证
    本篇内容主要讲解“怎么用vue实现登录注册及token验证”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用vue实现登录注册及token验证”吧!1. 利用router.beforeEach...
    99+
    2023-07-04
  • Vue实现用户登录及token验证
    在前后端完全分离的情况下,Vue项目中实现token验证大致思路如下: 1、第一次登录的时候,前端调后端的登陆接口,发送用户名和密码 2、后端收到请求,验证用户名和密码,验证成功,就...
    99+
    2022-11-12
  • SpringBoot集成JWT实现Token登录验证
    目录 1.1 JWT是什么? 1.2 JWT主要使用场景 1.3 JWT请求流程 1.4 JWT结构 二,SpringBoot集成JWT具体实现过程 2.1添加相关依赖 2.2自定义跳出拦截器的注解 2.3自定义全局统一返回值方法,异常类...
    99+
    2023-09-06
    spring boot 后端 java
  • nodejs实现登陆验证功能
    本文实例为大家分享了nodejs实现登陆验证的具体代码,供大家参考,具体内容如下 登陆验证需要提交数据,一种使用form表单提交数据,另一种使用原生js提交数据 form表单提交 搭...
    99+
    2022-11-13
  • SpringBoot登录验证token拦截器的实现
    目录注解定义token生成与验证拦截器定义拦截器配置定义拦截器的方法执行类注解使用返回值-全局异常类定义各种测试不传token制造可行的假token伪造token测试拓展:从请求中获...
    99+
    2022-11-13
  • vue实现token登录验证的完整实例
    目录token可用于登录验证和权限管理。登录页 -----Login.vue路由守卫 ----- router/index.js封装axios 添加请求拦截器 在每次请求之前进行的操...
    99+
    2022-11-13
  • Java实现Token登录验证的项目实践
    目录一、JWT是什么?二、使用步骤1.项目结构2.相关依赖3.数据库4.相关代码三、测试结果一、JWT是什么? 在介绍JWT之前,我们先来回顾一下利用token进行用户身份验证的流程...
    99+
    2023-03-19
    Java Token登录验证 Java 登录验证
  • layui实现登陆界面验证码
    本文实例为大家分享了layui实现登陆界面验证码的具体代码,供大家参考,具体内容如下 效果图: html: <div class="layui-form-item">...
    99+
    2022-11-12
  • python装饰器实现登陆验证
          ...
    99+
    2023-01-30
    python
  • Unity&Springboot实现本地登陆验证
    目录Springboot使用IDEA编译器IDEA上实现登录验证返回登录是否成功和登陆用户的id信息Unity端的请求Springboot使用IDEA编译器 IDEA上实现登录验证 ...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作