最近了解下基于 Token 的身份验证,跟大伙分享下。很多大型网站也都在用,比如 Facebook,Twitter,Google+,Github 等等,比起传统的身份验证方法,Token 扩展性更强,也更安全点,非常适合用在 Web 应用或者移动应用上。Token 的中文有人翻译成 “令牌”,我觉得挺好,意思就是,你拿着这个令牌,才能过一些关卡。
传统身份验证的方法
HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用。这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下。
解决的方法就是,当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的 ID 号发送给客户端,客户端收到以后把这个 ID 号存储在 Cookie 里,下次这个用户再向服务端发送请求的时候,可以带着这个 Cookie ,这样服务端会验证一个这个 Cookie 里的信息,看看能不能在服务端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给客户端。
上面说的就是 Session,我们需要在服务端存储为登录的用户生成的 Session ,这些 Session 可能会存储在内存,磁盘,或者数据库里。我们可能需要在服务端定期的去清理过期的 Session 。
基于 Token 的身份验证方法
使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:
- 客户端使用用户名跟密码请求登录
- 服务端收到请求,去验证用户名与密码
- 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
- 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
- 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
- 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据
JWT
实施 Token 验证的方法挺多的,还有一些标准方法,比如 JWT,读作:jot ,表示:JSON Web Tokens 。JWT 标准的 Token 有三个部分:
- header
- payload
- signature
中间用点分隔开,并且都会使用 Base64 编码,所以真正的 Token 看起来像这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ.SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc
Header
header 部分主要是两部分内容,一个是 Token 的类型,另一个是使用的算法,比如下面类型就是 JWT,使用的算法是 HS256。
{ "typ": "JWT", "alg": "HS256" }
上面的内容要用 Base64 的形式编码一下,所以就变成这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Payload
Payload 里面是 Token 的具体内容,这些内容里面有一些是标准字段,你也可以添加其它需要的内容。下面是标准字段:
- iss:Issuer,发行者
- sub:Subject,主题
- aud:Audience,观众
- exp:Expiration time,过期时间
- nbf:Not before
- iat:Issued at,发行时间
- jti:JWT ID
比如下面这个 Payload ,用到了 iss 发行人,还有 exp 过期时间。另外还有两个自定义的字段,一个是 name ,还有一个是 admin 。
{ "iss": "ninghao.net", "exp": "1438955445", "name": "wanghao", "admin": true }
使用 Base64 编码以后就变成了这个样子:
eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ
Signature
JWT 的最后一部分是 Signature ,这部分内容有三个部分,先是用 Base64 编码的 header.payload ,再用加密算法加密一下,加密的时候要放进去一个 Secret ,这个相当于是一个密码,这个密码秘密地存储在服务端。
- header
- payload
- secret
var encodedString = base64UrlEncode(header) + "." + base64UrlEncode(payload); HMACSHA256(encodedString, 'secret');
处理完成以后看起来像这样:
SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc
最后这个在服务端生成并且要发送给客户端的 Token 看起来像这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ.SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc
客户端收到这个 Token 以后把它存储下来,下回向服务端发送请求的时候就带着这个 Token 。服务端收到这个 Token ,然后进行验证,通过以后就会返回给客户端想要的资源。
相关链接
- http://jwt.io/
- https://github.com/firebase/php-jwt
- https://scotch.io/tutorials/the-anatomy-of-a-json-web-token
- https://github.com/auth0/jwt-decode
http://ninghao.net/blog/2834
相关推荐
基于token的身份验证可以替代传统的cookie+session身份验证方法。 JWT由三个部分组成:header.payload.signature 以下示例以JWT官网为例 header部分: { alg: HS256, typ: JWT } 对应base64UrlEncode编码为:...
12_基于JWT的Web API身份验证Json Web Token(jwt)是一种不错的身份验证及授权方案,简单的说就是调用端调用api时,附带上一个由api端颁发的token,以此来验证调用者的授权信息。
JWT(json web token)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准...下面这篇文章主要给大家介绍了关于基于Token的身份验证之JWT的基础相关资料,文中通过示例代码的非常详细,需要的朋友可以参考下
1. 安全性:项目集成了JWT(JSON Web Token)双Token机制,分别为访问Token和刷新Token,确保了用户身份的安全验证和数据传输的安全性。 2. 实时通信:利用WebSocket技术实现服务端与客户端之间的实时消息推送,提高...
JWT是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,...
json-web-token:jwt与基于会话的身份验证
基于令牌的身份验证使用JWT实现的基于令牌的身份验证(Java Web令牌)
JWT(JSON Web Token)是一种安全传输信息的标准,它可以在各种应用程序和服务之间安全地传输信息,例如用户身份验证和授权信息。在 .NET 中,我们可以使用 JWT 实现身份验证和授权,并基于声明式安全实现权限控制。...
Angular之jwt令牌身份验证 demo https://gitee.com/powersky/jwt 介绍 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于...
具有Flask的RESTAPI,使用基于令牌的身份验证。 技术: 烧瓶 烧瓶RESTFUL-0.3.8 Flask-JWT_Extended-4.1.0 Flask-SQLAlchemy-2.4.4 基本信息: JWT代表JSON WEB TOKEN,是在两方或实体之间传输随机令牌的一种...
这是一个“ Hello World”项目,旨在指导您如何集成基于JWT令牌的身份验证和VRaptor框架。 本示例在Tomcat 7上运行。 ##如何测试要测试它,您可以使用任何资源来发送带有授权标头的请求。 测试它的最简单方法是...
一个简单的后端框架,实现步骤可以根据文章 ...2.springboot+JWT+redis实现token身份令牌验证(附代码)(超详细) https://blog.csdn.net/pengpm/article/details/124077041?spm=1001.2014.3001.5501
能够解码AWS Cognito JWT idToken 验证JWT令牌签名验证JWT令牌发行者使用JWT令牌中包含的用户名创建主体对象将关联的认知组转换为SimpleGrantedAuthorities 该模块旨在弥合Cognito身份和Spring Boot安全主体之间的...
token 存储身份验证所有信息 , 服务端不需要保存用户身份验证信息, 减少服务端压力 , 服务端更容易水平扩展, 由于无状态, 又会导致它最大缺点 , 很难注销 2、 支持跨域访问 Cookie是不允许垮域访问的,token支持 3、...
这是一种使用JWT的身份验证API,您可以将其插入当前项目中,也可以从一个新项目开始。 电子邮件和密码用于身份验证。 遵循MVC模式(即模型)的基于Node.js,Express,MongoDB和Redis的API 看法控制器。 猫鼬用于在...
Hapi-Mongoose-JWT(Json Web Token) 示例这个应用程序的目的是展示一种使用 JWT、Hapi.js、Mongodb、Mongoose 的新方法。安装应用在命令提示符下在应用程序的根目录中运行以下命令。安装节点包服务器/节点安装安装...
身份验证是基于jwt的。 为了将身份验证与基本电子邮件/密码字段一起使用,我将passport与passport-local passport-jwt策略结合使用。 用户通过身份验证后, jwt token将发送到必须存储它的客户端。 当客户端要访问...
JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案。为了网络应用环境间传递声明而执行的一种基于JSON的开发标准(RFC 7519), 该token被设计为紧凑且安全的,特别适用于分布式站点的单点登陆(SSO)场景。...
该项目的目的是构建具有以下功能的灵活身份验证服务器: 易于部署:只需要在classpath中使用war和config文件 身份验证提供程序的多样性:内存,数据库,ldap等 基于JWT:提供JWT令牌 代币 此发行的令牌是JWT令牌...
使用以下方法通过JWT用户身份验证创建API: 节点js 表示 wt 护照 ArangoDB 要求 安装 安装 配置/include/config.js 设置JWT密钥 将位置设置为ArangoDB 在ArangoDB中设置数据库 安装 npm install 跑步 确保...