Bearer认证

HTTP提供了一套标准的身份验证框架:服务器可以用来针对客户端的请求发送质询(challenge),客户端根据质询提供身份验证凭证。质询与应答的工作流程如下:服务器端向客户端返回401(Unauthorized,未授权)状态码,并在WWW-Authenticate头中添加如何进行验证的信息,其中至少包含有一种质询方式。然后客户端可以在请求中添加Authorization头进行验证,其Value为身份验证的凭证信息。

在HTTP标准验证方案中,我们比较熟悉的是"Basic"和"Digest",前者将用户名密码使用BASE64编码后作为验证凭证,后者是Basic的升级版,更加安全,因为Basic是明文传输密码信息,而Digest是加密后传输。在前文介绍的Cookie认证属于Form认证,并不属于HTTP标准验证。

本文要介绍的Bearer验证也属于HTTP协议标准验证,它随着OAuth协议而开始流行,详细定义见: RFC 6570。

+--------+ +---------------+

| |--(A)- Authorization Request ->| Resource |

| | | Owner |

| |

| | +---------------+

| |

| | +---------------+

| |--(C)-- Authorization Grant -->| Authorization |

| Client | | Server |

| |

| | +---------------+

| |

| | +---------------+

| |--(E)----- Access Token ------>| Resource |

| | | Server |

| |

+--------+ +---------------+

Figure 1: Abstract Protocol Flow

Bearer验证中的凭证称为BEARER_TOKEN,或者是access_token,它的颁发和验证完全由我们自己的应用程序来控制,而不依赖于系统和Web服务器,Bearer验证的标准请求方式如下:

Authorization: Bearer [BEARER_TOKEN]

JWT(JSON WEB TOKEN)

上面介绍的Bearer认证,其核心便是BEARER_TOKEN,而最流行的Token编码方式便是:JSON WEB TOKEN。

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准[RFC 7519(https://tools.ietf.org/html/rfc7519)。该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

jwt主要包含以下三个内容:

头部 Header

载荷 Payload

签名 Signature

Jwt Token包含了使用.分隔的三部分

{Header 头部}.{Payload 负载}.{Signature 签名}

头部 Header

Header 一般由两个部分组成:

alg

typ

alg是是所使用的hash算法,如:HMAC SHA256或RSA,typ是Token的类型,在这里就是:JWT。

{

"alg": "HS256",

"typ": "JWT"

}

然后使用Base64Url编码成第一部分

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..

载荷 Payload

这一部分是JWT主要的信息存储部分,其中包含了许多种的声明(claims)。

Claims的实体一般包含用户和一些元数据,这些claims分成三种类型:

reserved claims:预定义的 一些声明,并不是强制的但是推荐,它们包括 iss (issuer), exp (expiration time), sub (subject),aud(audience) 等(这里都使用三个字母的原因是保证 JWT 的紧凑)。

public claims: 公有声明,这个部分可以随便定义,但是要注意和 IANA JSON Web Token 冲突。

private claims: 私有声明,这个部分是共享被认定信息中自定义部分。

一个简单的Pyload可以是这样子的:

{

"user_name": "admin",

"scope": [

"read","write","del"

],

"organization": "admin",

"exp": 1531975621,

"authorities": [

"ADMIN"

],

"jti": "23408d38-8cdc-4460-beac-24c76dc7629a",

"client_id": "webapp"

}

这部分同样使用Base64Url编码成第二部分

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.

签名 Signature

Signature是用来验证发送者的JWT的同时也能确保在期间不被篡改。

签名哈希部分是对上面两部分数据签名,通过指定的算法生成哈希,以确保数据不会被篡改。

首先,需要指定一个密码(secret)。该密码仅仅为保存在服务器中,并且不能向用户公开。然后,使用标头中指定的签名算法(默认情况下为HMAC SHA256)根据以下公式生成签名。

使用Base64编码后的header和payload以及一个秘钥,使用header中指定签名算法进行签名。

HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),

secret)

结果

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

base64UrlEncode

如前所述,JWT头和有效载荷序列化的算法都用到了Base64URL。该算法和常见Base64算法类似,稍有差别。

作为令牌的JWT可以放在URL中(例如api.example/?token=xxx)。 Base64中用的三个字符是"+","/"和"=",由于在URL中有特殊含义,因此Base64URL中对他们做了替换:"="去掉,"+"用"-"替换,"/"用"_"替换,这就是Base64URL算法,很简单把。

JWT的工作过程

客户端接收服务器返回的JWT,将其存储在Cookie或localStorage中。

此后,客户端将在与服务器交互中都会带JWT。如果将它存储在Cookie中,就可以自动发送,但是不会跨域,因此一般是将它放入HTTP请求的Header Authorization字段中。

Authorization: Bearer JWT_TOKEN

当跨域时,也可以将JWT被放置于POST请求的数据主体中。

使用JWT具有如下好处

通用:因为json的通用性,所以JWT是可以进行跨语言支持的,像JAVA,JavaScript,NodeJS,PHP等很多语言都可以使用。

紧凑:JWT的构成非常简单,字节占用很小,可以通过 GET、POST 等放在 HTTP 的 header 中,非常便于传输。

扩展:JWT是自我包涵的,包含了必要的所有信息,不需要在服务端保存会话信息, 非常易于应用的扩展。

内容来源于网络如有侵权请私信删除

bearer token头_BearerToken之JWT的介绍相关推荐

  1. jwt接口认证方式:Bearer Token

    jwt接口认证方式:Bearer Token 问题背景 在以前,用户进行认证的时候一般是: -> 用户向服务端发送验证信息(用户名.密码). -> 服务端验证成功就向用户返回一个sessi ...

  2. 什么是JWT?OAuth2以及Bearer Token基本解析

    最近在做关于不同权限用户对接口权限访问的校验程序,包括基于 Bearer token&&Password 的 OAuth2 校验方式以及 基于JWT tokens with Beare ...

  3. Bearer ${Token},放置在HTTP头中发送

    目录 前言 一.代码 总结 前言 今天对接接口时一个新的需求,token值需要在HTTP头部发送请求. 一.代码 public static String doHeaderGet(String url ...

  4. 详解OAuth 2.0授权协议(Bearer token)

    OAuth 2.0授权协议 1 认证(Authentication) 2 授权(Authorization) 3 OAuth 2.0与认证机制的联系 4 详解OAuth 2.0授权协议 4.1 授权码 ...

  5. OAuth 2.0: Bearer Token Usage

    Bearer Token (RFC 6750) 用于OAuth 2.0授权访问资源,任何Bearer持有者都可以无差别地用它来访问相关的资源,而无需证明持有加密key.一个Bearer代表授权范围.有 ...

  6. Bearer Token的相关定义与使用方法

    原文地址:http://www.haomou.net/2014/08/13/2014_bare_token/ 来龙去脉 诸如Ember,Angular,Backbone之类的前端框架类库正随着更加精细 ...

  7. Postman如何携带token——Bearer Token和Headers

    目录 一.使用场景 二.设置Bearer Token 1.设置你的环境变量 2.项目集合设置认证方式及环境变量 3.登录接口的脚本 三.通过脚本设置Headers 1.登录请求设置环境变量 2.设置集 ...

  8. Java实现Token登录验证(基于JWT的token认证实现)

    文章目录 一.JWT是什么? 二.使用步骤 1.项目结构 2.相关依赖 3.数据库 4.相关代码 三.测试结果 一.JWT是什么? 在介绍JWT之前,我们先来回顾一下利用token进行用户身份验证的流 ...

  9. ASP.NET Core Web API 集成测试中使用 Bearer Token

    在 ASP.NET Core Web API 集成测试一文中, 我介绍了ASP.NET Core Web API的集成测试. 在那里我使用了测试专用的Startup类, 里面的配置和开发时有一些区别, ...

最新文章

  1. 磁珠,电感,零欧电阻之间的区别
  2. 简单阻容降压电路图_X2安规电容用于阻容降压容量衰减原因及对策
  3. MapReduce案例-wordcount-准备工作
  4. Pandas高级教程之:GroupBy用法
  5. access子窗体的控件vba怎么写_第37讲:VBA代码中运行错误的处理方式
  6. mac的 上传到linux服务器地址,【mac 怎么登录到 linux 服务器并传输文件?】-看准网...
  7. GDAL库调试(包括跨语言调试)
  8. gsonformat 实例_10分钟看懂Photoshop 实例:在阈值模式下调整照片的清晰度
  9. FPGA中数的表示方法
  10. forever不重启 node_node.js – NodeJS和Forever(监控并重启应用)
  11. 解决异常 more than one ‘primary‘ bean found among candidates: [jacksonObjectMapper, objectMapper]
  12. Windows 下安装sql server 2016(附安装包资源)
  13. Linux操作系统安全(一)
  14. windows配置JDK(winds10)
  15. 深入安卓Package Manager和Package Installer
  16. php框架利弊,ThinkPHP框架的优缺点是什么
  17. sygate45chs激活
  18. 用RecyclerView来实现苹果后台样式的卡片布局
  19. 安居客 Android APP 走向平台化 | 开发者说·DTalk
  20. 水利工程数字孪生技术研究与探索

热门文章

  1. Tailwind教程2 - 基础样式
  2. RabbitMQ配置之mandatory,publisher-returns相关
  3. PDU会话建立流程(8)-SM Policy Association的建立
  4. 操作系统饥饿现象_操作系统中的饿死现象怎样理解?
  5. 安装post man
  6. 伪干货:应届生找工作与入职心得
  7. html怎样图片不会失真,css解决图片失真
  8. 数据库四大特性ACID
  9. 【转载】[学习笔记]共轭转置矩阵与伴随矩阵都用A*表示合理吗?
  10. JAVA和SQL中时间的格式化 (yyyy-MM-dd HH:mm:ss转换规则)知识总结