Token 是在服务端产生的。如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端。前端以后再次请求的时候带上 Token 证明自己的合法地位,无需再次带上用户名和密码。其流程如图1所示。

图1 token认证过程

基本流程是这样的:

  1. 客户端使用用户名跟密码请求登录
  2. 服务端收到请求,去验证用户名与密码
  3. 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
  4. 客户端收到Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
  5. 客户端每次向服务端请求资源的时候需要带着服务端签发的Token
  6. 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据

一、token的优势

1.无状态

Token机制在服务端不需要存储session信息,因为Token 自身包含了所有登录用户的信息,只需要在客户端的cookie或本地介质存储状态信息。

2.安全性

  请求中发送token而不再是发送cookie能够防止CSRF(跨站请求伪造)。即使在客户端使用cookie存储token,cookie也仅仅是一个存储机制而不是用于认证。

3.更适用于移动应用

当你的客户端是一个原生平台(iOS, Android,Windows 8等)时,Cookie是不被支持的(你需要通过Cookie容器进行处理),这时采用Token认证机制就会简单得多。

4.多平台跨域

  我们提前先来谈论一下CORS(跨域资源共享),对应用程序和服务进行扩展的时候,需要介入各种各种的设备和应用程序。只要用户有一个通过了验证的token,数据和资源就能够在任何域上被请求到。

5.基于标准
  你的API可以采用标准化的 JSON Web Token (JWT). 这个标准已经存在多个后端库(.NET, Ruby, Java,Python, PHP)和多家公司的支持(如:Firebase,Google, Microsoft)。

二、token生成

在python中,我们可以使用itsdangerous模块生成token,并且可以设置时限,不用在服务器端保存用户登录数据。

from itsdangerous import SignatureExpired,  BadData, BadSignature
from itsdangerous.url_safe import URLSafeTimedSerializerclass TokenException(Exception):def __init__(self,obj):super().__init__()self.status = {}if isinstance(obj,SignatureExpired):self.status['code'] = -1self.status['msg'] = "签名过期"elif isinstance(obj,BadSignature):self.status['code'] = -2self.status['msg'] = "签名失效"elif isinstance(obj,BadData):self.status['code'] = -3self.status['msg'] = "数据异常"@propertydef code(self):return self.status['code']@propertydef message(self):return self.status['msg']def __str__(self):return self.status['msg']class TokenManager:def __init__(self,secret_key,salt='hello world'):"""secret_key 加密密钥"""self.secret_key = secret_keyself.salt = saltdef generate_token(self,playload):""":param playload: 负载,也就是你要序列化的数据,不要用关键数据(如密码等)做playload:return: token字符串"""serializer = URLSafeTimedSerializer(self.secret_key, self.salt)return serializer.dumps(playload)def confirm_token(self,token,expired=3600):"""验证token:param token: generate_validate_token产生的字符串:param expired: 过期时间,以秒为单位:return: 成功返回负载数据,失败返回错误码"""serializer = URLSafeTimedSerializer(self.secret_key, self.salt)try:data = serializer.loads(token,max_age=expired)except BadData as e:return TokenException(e)# 签名验证通过,返回原始数据return dataif __name__ == '__main__':tm = TokenManager('kdkdk',salt="hello")# 获取签名数据uid = 10token = tm.generate_token(uid)print(token)# 验证,默认是1个小时# data = tm.confirm_token(token)# print(data)# 签名失效token = token + 'dd'data = tm.confirm_token(token)print(data,type(data))

fastadmin token 验证错误_用签名保护你的隐私(4)--token生成相关推荐

  1. api签名_使用签名保护基于HTTP的API

    api签名 我在EMC上的一个平台上可以构建SaaS解决方案. 与越来越多的其他应用程序一样,该平台具有基于RESTful HTTP的API. 使用JAX-RS之类的开发框架,构建这样的API相对容易 ...

  2. api token 什么意思_还分不清 Cookie、Session、Token、JWT?

    什么是认证(Authentication) 通俗地讲就是验证当前用户的身份,证明"你是你自己"(比如:你每天上下班打卡,都需要通过指纹打卡,当你的指纹和系统里录入的指纹相匹配时,就 ...

  3. fastadmin出现token验证错误!_gitee 拥有3.7k星星的极速后台框架—FastAdmin了解一下...

    前言 FastAdmin 是一款基于 ThinkPHP5 + Bootstrap 的极速后台开发框架,并且FastAdmin是遵循Apache2开源协议发布的.拥有一键生成CRUD/一键生成菜单/一键 ...

  4. gridcontrol 验证错误_值得品读的人生感悟句子,生气,是拿别人的错误惩罚自己...

    一 * 世上没有一件工作不辛苦,没有一处人事不复杂.不要随意发脾气,谁都不欠你的.学会低调,取舍间必有得失,不用太计较.学着踏实而务实,越努力越幸运.当一个人有了足够的内涵和物质做后盾,人生就会变得底 ...

  5. token验证失败_ASP.NET CORE WEBAPI JWT 带BEARER的TOKEN

    JWT主要由三部分构成,header. payload .signature,下面给出详细的TOKEN生成及使用代码. 1.注册JWT服务 public void ConfigureServices( ...

  6. Spring Boot+Spring Security+JWT 实现token验证

    Spring Boot+Spring Security+JWT 实现token验证 什么是JWT? JWT的工作流程 JWT的主要应用场景 JWT的结构 SpringBoot+Spring Secur ...

  7. go token验证_golang jwt+token验证的实现

    Token验证是验证用户身份的重要方式,在golang开发中具有广泛应用,文中主要阐述了利用jwt包加密后的token验证. 导入包: import ( "github.com/dgrija ...

  8. 微信公众平台服务器配置时token验证失败

    这两天一直在弄微信公众号开发,在进行服务器配置时,发现总是返回token验证失败.这个问题困扰了两天,今天终于解决了.现在总结一下. 一般来说服务器配置token验证失败,可能有以下几个方面: 1.服 ...

  9. flask实现token验证

    from flask import Flask from flask.globals import request from flask.json import jsonify from itsdan ...

最新文章

  1. mysql大于等于怎么写_数据库中大于等于0小于等于100怎样表达
  2. 校园送礼风为何难刹住 “送了没个完,不送没个底”
  3. python dlib学习(十一):眨眼检测
  4. 码农与程序员的惊人差别
  5. python 第三方库
  6. 使用Eclipse开发Java Web过程中Debug调试的使用方法
  7. 贝叶斯决策理论对CIFAR-10数据图像分类
  8. bs模式Java web,基于BS模式的即时通讯系统的设计与实现(MyEclipse)
  9. linux二进制安装包制作,linux下二进制安装包的创建
  10. DVWA-CSRF-low级别
  11. oracle排序字符,Oracle数据字符集和排序的用法
  12. Linux文件系统结构
  13. python基础篇——异常
  14. YoutuBe 是如何利用深度学习解决搜索推荐问题的? (一) - 论文翻译
  15. 中职学计算机专业考本科难吗,国际本科难不难(中职考本科难不难)
  16. android app闪退原因,如何解决app闪退问题
  17. Oracle的Replace函数与translate函数详解与比较
  18. ansible(一)自动化运维工具
  19. php-获取从今天开始计算第5个工作日的日期
  20. C语言对称矩阵的判定

热门文章

  1. 180405之循环嵌套
  2. Nerv --- React IE8 兼容方案
  3. 第二十七篇、使用MVVM布局页面
  4. 【转】C#安装包(自动卸载低版本)
  5. 企业级账号 版本更新总结
  6. oracle 误删表空间文件启动不了数据库的解决办法
  7. 备注:centos加永久路由
  8. ZZULIOJ 1123: 最佳校友
  9. 信息奥赛一本通(1096:数字统计)
  10. Menagerie(AtCoder-2234)