什么是Token(令牌)

2023-10-27

Acess Token

  • 访问资源接口(API)时所需要的资源凭证

  • 简单token 的组成: uid(用户唯一的身份标识) 、time (当前时间的时间戳) ,sign(签名,token的前几位以hash算法压缩成的一定长度的16进制字符串)

  • 特点:

    • 服务端无状态变化、可扩展性好

    • 支持移动端设备

    • 安全

    • 支持跨域程序调用

    • token 的身份验证流程Token的身份验证流程

      • 客户端使用用户名和密码进行登录
      • 服务端收到请求,去验证用户名与密码
      • 验证成功后,服务端会签发一个token 并把这个token 发送给客户端
      • 客户端收到token后,会把它存储起来,比如放在cookie 里 或者 localStorage里
      • 客户端每次向服务端请求资源的时候需要带着服务端签发的token
      • 服务端收到请求后,先验证客户端请求里带着的token ,如果验证成功,就向客户端返回请求的数据
      • 优点:
        • 每一次请求都需要携带token ,需要把token 放到HTTP的Header 里
        • 基于token 的用户验证是一种服务端无状态的认证方式,服务端不用存放token数据,用解析token的计算时间换取 session的存储空间,从而减轻服务器的压力,减少频繁的查询数据库
        • token 完全由应用管理,所以它可以避开同源策略
      • Token生成示例
        使用用户唯一ID + 系统时间 + 随机数 + 过期时间得到用户信息数据,对用户信息数据进行RSA非对称加密/AES对称加密得到一个加密字符串A,将加密字符串A再次进行签名等到一个签名数据。然后将签名数据和加密字符串进行拼接,最后使用base64进行编码,得到最终的token令牌。
      	/**
       *
       * @param tokenBody 实例对象,通常为bean
       * @param minute 过期时间   单位:min
       * @param <T>
       * @return
       */
      public static <T> String createToken(T tokenBody, int minute) {
          long now = System.currentTimeMillis() / 1000;
          Gson gson = new Gson();
          JsonObject jsonBody = new JsonObject();
          jsonBody.addProperty("body", gson.toJson(tokenBody));
      
          String randomAlphabetic = RandomStringUtils.randomAlphabetic(3);
          JsonObject jsonHeader = new JsonObject();
          jsonHeader.addProperty("now", now);
          jsonHeader.addProperty("rand_num", randomAlphabetic);
          jsonHeader.addProperty("expire", (now + minute * 60));
      
          String token = null;
          try {
              byte[] encryptContent = generateEncryptBody(jsonHeader.toString(), jsonHeader.toString());
              byte[] signWithEncrypt = generateSignWithEncrypt(encryptContent);
              token = Joiner.on(".").join(new String[]{base64Encoder(
                      jsonHeader.toString().getBytes("utf-8")),
                      base64Encoder(encryptContent),
                      base64Encoder(signWithEncrypt)}
                      );
          } catch (Exception e) {
              e.printStackTrace();
          }
          return token;
      }
      

    常见的鉴权模式

    • session-Cookie
    • Token验证(JWT SSO单点登录)
    • OAuth2.0 (开放授权)

    JWT 与 Token 的区别

    • 相同:
      • 都是访问资源的令牌
      • 都可以记录用户的信息
      • 都是使服务端无状态变化
      • 都是验证成功后,客户端才能访问服务端上受保护的资源
  • 区别

    • Token: 服务端验证客户端发送过来的Token 时,还需要查询数据库获取用户信息,然后验证Token 是否有效
    • JWT: 将token 和 Payload 加密后存储于客户端,服务端只需要使用秘钥进行校验即可,不需要查询或者减少查询数据库,因为JWT自包含了用户信息和加密的数据
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是Token(令牌) 的相关文章

  • OpenCV 中的 Gabor 内核参数

    我必须在我的应用程序中使用 Gabor 过滤器 但我不知道这个 OpenCV 方法参数值 我想对虹膜进行编码 启动 Gabor 过滤器并获取特征 我想对 12 组 Gabor 参数值执行此操作 然后我想计算 Hamming Dystans
  • 如何使用 Java 处理 Selenium WebDriver 中的新窗口?

    这是我的代码 driver findElement By id ImageButton5 click Thread sleep 3000 String winHandleBefore driver getWindowHandle drive
  • java中如何连接字符串

    这是我的字符串连接代码 StringSecret java public class StringSecret public static void main String args String s new String abc s co
  • 按第一列排序二维数组,然后按第二列排序

    int arrs 1 100 11 22 1 11 2 12 Arrays sort arrs a b gt a 0 b 0 上面的数组已排序为 1 100 1 11 2 12 11 22 我希望它们按以下方式排序a 0 b 0 首先 如果
  • 如何在不超过最大值的情况下增加变量?

    我正在为学校开发一个简单的视频游戏程序 我创建了一个方法 如果调用该方法 玩家将获得 15 点生命值 我必须将生命值保持在最大值 100 并且由于我目前的编程能力有限 我正在做这样的事情 public void getHealed if h
  • Java 文件上传速度非常慢

    我构建了一个小型服务 它从 Android 设备接收图像并将其保存到 Amazon S3 存储桶中 代码非常简单 但是速度非常慢 事情是这样的 public synchronized static Response postCommentP
  • 匿名类上的 NotSerializedException

    我有一个用于过滤项目的界面 public interface KeyValFilter extends Serializable public static final long serialVersionUID 7069537470113
  • 如何使用 Maven 打包并运行具有依赖项的简单命令行应用程序?

    我对 java 和 Maven 都是全新的 所以这可能非常简单 如果我遵循maven2hello world此处的说明 http maven apache org guides getting started maven in Five m
  • 具有 java XSLT 扩展的数组

    我正在尝试使用 java 在 XSLT 扩展中使用数组 我收到以下错误 Caused by java lang ClassCastException org apache xpath objects XObject cannot be ca
  • 使用 SQLITE 按最近的纬度和经度坐标排序

    我必须获得一个 SQLite SQL 语句 以便在给定初始位置的情况下按最近的纬度和经度坐标进行排序 这是我在 sqlite 数据库中的表的例句 SELECT id name lat lng FROM items EXAMPLE RESUL
  • 普罗米修斯指标 - 未找到

    我有 Spring Boot 应用程序 并且正在使用 vertx 我想监控服务和 jvm 为此我选择了 Prometheus 这是我的监控配置类 Configuration public class MonitoringConfig Bea
  • 以编程方式在java的resources/source文件夹中创建文件?

    我有两个资源文件夹 src 这是我的 java 文件 资源 这是我的资源文件 图像 properties 组织在文件夹 包 中 有没有办法以编程方式在该资源文件夹中添加另一个 properties 文件 我尝试过这样的事情 public s
  • 在游戏视图下添加 admob

    我一直试图将 admob 放在我的游戏视图下 这是我的代码 public class HoodStarGame extends AndroidApplication Override public void onCreate Bundle
  • react-native run-android 失败并出现错误:任务 ':app:dexDebug' 执行失败

    我使用的是 Windows 8 1 和react native cli 1 0 0 and react native 0 31 0 添加后react native maps对于该项目 我运行了命令react native upgrade并给
  • Javafx过滤表视图

    我正在尝试使用文本字段来过滤表视图 我想要一个文本字段 txtSearch 来搜索 nhs 号码 名字 姓氏 和 分类类别 我尝试过在线实施各种解决方案 但没有运气 我对这一切仍然很陌生 所以如果问得不好 我深表歉意 任何帮助将不胜感激 我
  • Netty:阻止调用以获取连接的服务器通道?

    呼吁ServerBootstrap bind 返回一个Channel但这不是在Connected状态 因此不能用于写入客户端 Netty 文档中的所有示例都显示写入Channel从它的ChannelHandler的事件如channelCon
  • 我可以创建自定义 java.* 包吗?

    我可以创建一个与预定义包同名的自己的包吗在Java中 比如java lang 如果是这样 结果会怎样 这难道不能让我访问该包的受保护的成员 如果不是 是什么阻止我这样做 No java lang被禁止 安全管理器不允许 自定义 类java
  • 替换后增量

    我自己已经有一个问题了 但我想扩展它后增量示例 https stackoverflow com questions 51308967 post increment with example char a D int b 5 System o
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 带有 Maven Wrapper 的 Java 17 导致无法识别的 VM 选项“MaxPermSize=512m”

    I use OpenJDK 17 https jdk java net 17 使用 Maven Wrapper 3 8 2 从春季初始化 https start spring io Maven项目 JAR打包 Java 17 Spring

随机推荐

  • 小学计算机设备维修维护记录簿,设备维修保养记录文本表.doc

    专业技术资料分享 WORD资料 下载可编辑 每 周月季 设备维修养护记录表 口 机电设备 口机械仪表 口辅助设施 年 月 日 编号 设备名称 传送带 回流焊 老化线 刷锡机 申报人 口 日常维修 保养 型号 主任人 口 大修 口小修 保修内
  • tar压缩和解压文件或文件夹

    1 使用tar压缩文件 tar zcvf test tar gz test 该命令表示压缩当前文件夹下的文件夹test 压缩后缀名为test tar gz 如果不需要压缩成gz 只需要后缀为tar格式的 那么输入如下命令 tar cvf t
  • 数据集路径输入

    from os import listdir from os path import isfile join import tensorflow as tf import matplotlib pyplot as plt dataset p
  • C++考试酷考试题

    1 C 函数的传递方式有 1 值传递 2 指针传递 3 引用传递 2 内存的分配方式有 1 从静态存储区域分配 2 在栈上创建 3 常量区 4 从堆上分配 3 面向对象的基本特征 1 继承 2 封装 3 多态 4 Switch 中不允许的数
  • 详解nginx的原生被动健康检查机制&灾备使用(含测试)

    nginx作为一个集web服务器 cache 7层lb于一身的全能型选手 已经应用到互联网各种领域 其高性能 易使用的技术品质深得人心 连同在其基础上二开的tengine openresty都有很大的用户量 今天剖开讲一下nginx健康检查
  • python3 类对象的定义、方法

    类 Class 对象 定义 方法 面向对象的定义 类 Class 用来描述具体相同的属性和方法的对象的集合 定义了该集合中每个对象所共有的属性和方法 对象是类的示例 类变量 类变量在整个实例化的对象中是公用的 类变量定义在类中且在函数体之外
  • C# 实现Json文件读写

    JSON是一种轻量级的数据交换格式 它基于 ECMAScript的一个子集 采用完全独立于编程语言的文本格式来存储和表示数据 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言 易于人阅读和编写 同时也易于机器解析和生成 并有效地提
  • 写一个 RecentCounter 类来计算特定时间范围内最近的请求

    class RecentCounter int count public RecentCounter this count 0 Queue
  • Doris窗口函数经典案例:遇到标志划分组

    需求 将上面的表转化成下面的形式 首先按照用户进行分组 在用户分组的基础上 name字段每遇到一个e 就分一组 user id name u1 e1 u1 e1 u1 e u1 e2 u1 e3 u1 e u2 e1 u2 e2 u2 e
  • SpringCloud-Geteway之限流,熔断(超详细篇)

    目录 一 Sentinel 服务容错 1 1 高并发带来的问题 1 使用压测工具 对请求进行压力测试 2 修改配置文件中tomcat的并发数 1 2 服务雪崩效应 1 3 常见容错方案 1 4 Sentinel入门 什么是Sentinel
  • # PIC32MK1024GPE100-串口BootLoader ## 传统BootLoader(不带BANK切换)

    下面开始具体操作 稍微带一点理论 研究不深 编译环境 mplab x ide v5 5 mhc harmoney v3 0 第一步 创建BootLoader工程 创建工程 如图1 这里不展开讲 只讲注意点 注意 1 配置好板子上对应引脚 如
  • AutoDL使用教程:1)创建实例 2)配置环境+上传数据 3)PyCharm2021.3专业版下载安装与远程连接完整步骤 4)实时查看tensorboard曲线情况

    目录 写在前面 重要的参考链接 一 创建实例 二 配置环境 上传数据流程 1 先下载好镜像 然后通过Xftp软件上传 2 上传数据到AutoDL自带的网盘中 1 直接上传 每次只能上传单个文件 建议上传zip压缩包 2 借助Xftp软件 不
  • ORA-01578(数据块损坏)错误解决方法

    错误 在 exp 时出现以下错误 EXP 00056 遇到 ORACLE 错误 1578 ORA 01578 ORACLE 数据块损坏 文件号4 块号65 ORA 01110 数据文件 4 E ORACLE ORADATA USERS DB
  • Python opencv学习-7图像梯度学习

    图像梯度学习 再次感觉到 先不求甚解 现阶段学习思路为会用就行 基本原理不做太深研究 理解大概原理就行 以下为两个实验 主要演示了sobel求图像梯度的过程 和问题的解决 第一个实验只能找到一种边界 原理 简单的来说 梯度的原理就是求导数
  • opencv的图像编解码问题

    问题1 不同版本的opencv读取的图像数据灰度值不一样 问题2 一个版本的opencv保存的图像 用另一个版本的opencv无法打开 两个问题的原因 不同版本的opencv发布包 从官方下载的dll和lib 采用了不同版本的图像编解码库
  • html p怎么设置空两格,【总结】怎样在

    标签内显示空格——空格实体

    一般在 标签中 无论文字间有几个空格都只会显示一个 若需显示多个 则需用到html中的几种空格实体 即不换行空格 全称No Break Space 是最常见且使用最多的空格 HTML字符值引用为 宽度受字体影响明显而强烈 即 半角空格 全称
  • 解决复制粘贴出现的错误

    proc2 c 49 5 错误 程序中有游离的 240 proc2 c 49 5 错误 程序中有游离的 302 proc2 c 49 5 错误 程序中有游离的 240 proc2 c 49 5 错误 程序中有游离的 302 proc2 c
  • 2022年度笔记本十大热门品牌销量排行榜

    近年来 由于大环境的改变 线上教育 线上办公等的需求使得平板电脑出货量逐步提升 同时 5G时代来临 万物互联是未来的趋势 手机由于操作系统和交互上的局限性 笔记本电脑将会扮演更加重要的角色 未来 整个笔记本电脑行业的空间有望进一步打开 根据
  • 数据结构代码——折半插入排序

    折半插入排序的算法思想可以参考王道数据结构的书 建议先看书或者通过B站学习相关课程了解算法思想后再看代码 代码 define CRT SECURE NO WARNINGS 1 define ElemType int include
  • 什么是Token(令牌)

    Acess Token 访问资源接口 API 时所需要的资源凭证 简单token 的组成 uid 用户唯一的身份标识 time 当前时间的时间戳 sign 签名 token的前几位以hash算法压缩成的一定长度的16进制字符串 特点 服务端