`
m635674608
  • 浏览: 5043118 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

jwt 基于 Token 的身份验证

 
阅读更多

最近了解下基于 Token 的身份验证,跟大伙分享下。很多大型网站也都在用,比如 Facebook,Twitter,Google+,Github 等等,比起传统的身份验证方法,Token 扩展性更强,也更安全点,非常适合用在 Web 应用或者移动应用上。Token 的中文有人翻译成 “令牌”,我觉得挺好,意思就是,你拿着这个令牌,才能过一些关卡。

传统身份验证的方法

HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用。这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下。

解决的方法就是,当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的 ID 号发送给客户端,客户端收到以后把这个 ID 号存储在 Cookie 里,下次这个用户再向服务端发送请求的时候,可以带着这个 Cookie ,这样服务端会验证一个这个 Cookie 里的信息,看看能不能在服务端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给客户端。

上面说的就是 Session,我们需要在服务端存储为登录的用户生成的 Session ,这些 Session 可能会存储在内存,磁盘,或者数据库里。我们可能需要在服务端定期的去清理过期的 Session 。

基于 Token 的身份验证方法

使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:

  1. 客户端使用用户名跟密码请求登录
  2. 服务端收到请求,去验证用户名与密码
  3. 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
  4. 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
  5. 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
  6. 服务端收到请求,然后去验证客户端请求里面带着的 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://ninghao.net/blog/2834

分享到:
评论

相关推荐

    JWT Token生成及验证

    JWT在身份验证和授权场景中广泛应用,尤其是在微服务架构和API安全中。 在C#中实现JWT Token的生成和验证,主要涉及到以下几个关键知识点: 1. **JWT结构**:每个JWT由三个部分组成,用`.`分隔,分别是Header...

    asp.net webapi2 基于token令牌的身份验证

    在现代Web应用中,基于Token的身份验证机制已经成为一种流行的安全实践,尤其是OAuth2和JWT(JSON Web Tokens)的广泛应用。本文将深入探讨ASP.NET WebAPI2如何实现基于Token的令牌身份验证。 首先,我们需要理解...

    JWT 生成Token及验证.PDF

    JWT 生成 Token 及验证 JWT(JSON Web Token)是一种用于双方之间传递安全信息的简洁、URL 安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种...它广泛应用于身份验证、授权和信息交换等领域。

    php实现JWT(json web token)鉴权实例详解

    基于token的身份验证可以替代传统的cookie+session身份验证方法。 JWT由三个部分组成:header.payload.signature 以下示例以JWT官网为例 header部分: { alg: HS256, typ: JWT } 对应base64UrlEncode编码为:...

    Webapi_JWT_Authentication-master_webapi_jwt_token_

    WebAPI与JWT(JSON Web Tokens)身份验证是一种常见的安全机制,用于保护WebAPI接口免受未经授权的访问。JWT令牌提供了一种轻量级的方式来进行身份验证和授权,它允许服务器在客户端之间安全地传递信息,而无需存储...

    Node.js-一个基于token的验证登录

    在本文中,我们将深入探讨如何使用Node.js、Vue.js和MongoDB实现基于Token的验证登录系统,特别是通过JSON Web Tokens(JWT)进行身份验证。这是一个常见的Web应用安全实践,能够确保用户信息的安全,并且便于跨域...

    ASP.NET Core 3.1 JWT token实现与应用

    JWT(JSON Web Token)是安全领域广泛采用的一种轻量级身份验证机制,常用于实现API的身份验证和授权。在ASP.NET Core 3.1中,我们可以方便地集成JWT来创建安全的令牌系统。以下是对JWT Token在ASP.NET Core 3.1中的...

    JAVA中的Token 基于Token的身份验证实例

    JAVA中的Token基于Token的身份验证实例 本文档主要介绍了JAVA中的Token基于Token的身份验证实例,具有很好的参考价值。本文将详细介绍基于Token的身份验证方法,并与传统的身份验证方法进行比较。 一、传统身份...

    基于Token的身份验证的方法

    总结来说,基于Token的身份验证方法,特别是JWT,提供了一种轻量级、安全且易于扩展的认证方案。相比于传统的Session机制,它减少了服务器的存储和管理负担,增强了分布式系统的互操作性,广泛应用于现代Web和移动...

    Springboot+Shiro+jwt+Redis+Mybatis 有效期内Token刷新方案.zip

    本方案主要涉及Spring Boot、Apache Shiro、JSON Web Token (JWT)、Redis以及Mybatis等技术,它们共同构建了一个高效且灵活的身份验证和令牌刷新机制。下面我们将深入探讨这个方案的各个组件及其作用。 首先,...

    SpringBoot集成JWT生成token及校验方法过程解析

    JSON Web Tokens(JWT)是一种基于 Token 的身份验证机制,主要用于客户端和服务器端之间的身份验证。JWT token由三个部分组成:Header、Payload和Signature。其中,Header和Payload是明文的,Signature是通过Secret...

    REST2SQL11 基于jwt-go生成token与验证

    JWT是一种轻量级的身份验证机制,用于安全地传递信息,而无需在服务器之间共享秘密。在REST2SQL系列的第11部分中,我们将关注这个关键的认证过程。 首先,让我们了解JWT的基本概念。JWT由三部分组成:头部(Header...

    webapi JWT身份验证Demo

    【标题】:“WebAPI JWT身份验证Demo”是一个演示项目,展示了如何在基于.NET Core的WebAPI中实现JSON Web Token(JWT)的身份验证机制。JWT是一种轻量级的安全身份验证标准,广泛应用于现代Web应用程序,尤其是API...

    基于springboot+springSecurity+jwt实现的基于token的权限管理+源代码+文档

    在基于Token的权限管理中,JWT通常用于身份验证和授权。当用户成功登录后,服务器会返回一个JWT,客户端将其存储起来,然后在后续请求中携带此Token,服务器通过验证Token来确定用户的身份和权限。 在这个项目中,...

    基于springboot+springSecurity+jwt实现的基于token的权限管理

    这个基于"springboot+springSecurity+jwt实现的基于token的权限管理"的示例项目,旨在帮助开发者理解和实践这些技术。 首先,Spring Boot是Spring框架的简化版,它提供了快速构建和部署应用程序的能力。通过自动...

    SpringMVC精品资源--整合JWT,spring,springMVC,实现基于token验证.zip

    【标题】中的“SpringMVC精品资源--整合JWT,spring,springMVC,实现基于token验证”是一个关于使用Spring框架,特别是SpringMVC,与JSON Web Tokens (JWT)集成的教程或项目。这个主题涉及了现代Web应用中常见的...

    基于token的登陆验证机制.docx

    JWT是一种常用的基于Token的认证标准,它允许各方之间安全地传输信息。JWT包含三个部分:头部、载荷和签名,三者之间通过点号连接。下面简要介绍JWT的实现过程: 1. **依赖引入**:首先需要在项目中引入JWT相关的库...

    【ASP.NET编程知识】asp.net基于JWT的web api身份验证及跨域调用实践.docx

    在身份验证方面,传统的基于Cookie的Session ID的做法面临着跨域提交Cookie的问题,于是Json Web Token(JWT)成为了一种不错的身份验证及授权方案。 在本文中,我们将编写一个基于JWT进行身份验证的ASP.NET Web ...

    node实现基于token的身份验证

    "Node实现基于Token的身份验证" Node.js是目前最流行的服务器端编程语言之一,而身份验证是 Node.js 应用程序中最重要的部分之一。本文将主要介绍 Node.js 实现基于 Token 的身份验证,并对 Token 验证机制进行详细...

Global site tag (gtag.js) - Google Analytics