用户鉴权、JWT(JSON Web Token)是什么?

简介: 用户鉴权、JWT(JSON Web Token)是什么?

什么是用户鉴权


用户鉴权,一种用于在通信网络中对试图访问来自服务提供商的服务的用户进行鉴权的方法。用于用户登陆到DSMP或使用数据业务时,业务网关或Portal发送此消息到DSMP,对该用户使用数据业务的合法性和有效性(状态是否为激活)进行检查。来自百度百科:用户鉴权



四种鉴权的机制


1、HTTP Basic Authentication

这种授权方式是浏览器遵守 http 协议实现的基本授权方式,HTTP 协议进行通信的过程中,HTTP 协议定义了基本认证认证允许 HTTP 服务器对客户端进行用户身份证的方法。


2、session-cookie

HTTP Cookie(也叫 Web Cookie 或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie 使基于无状态的 HTTP 协议记录稳定的状态信息成为了可能。


3、Token 令牌


认证过程


用户输入登陆凭据;


服务器验证凭据是否正确,然后返回一个经过签名的token;


客户端负责存储token,可以存在localstorage,或者cookie中

对服务器的请求带上这个token;


服务器对 JWT 进行解码,如果 token 有效,则处理该请求;


一旦用户登出,客户端销毁 token。



4、OAuth(开放授权)


OAUTH 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 OAUTH 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 OAUTH 是安全的。同时,任何第三方都可以使用 OAUTH 认证服务,任何服务提供商都可以实现自身的 OAUTH 认证服务,因而 OAUTH 是开放的。


我们常见的提供 OAuth 认证服务的厂商有支付宝,QQ,微信。


OAuth 协议又有 1.0 和 2.0 两个版本。相比较 1.0 版,2.0 版整个授权验证流程更简单更安全,也是目前最主要的用户身份验证和授权方式。


参考资料:4种常见的鉴权方式及说明


下面将使用 Token 令牌的方式。在此之前我们先了解一下 JWT




什么是 JWT (JSON Web Token)


1、概念

JSON Web Token (JWT) 是一种开放标准 ( RFC 7519 ),它定义了一种紧凑且自包含的方式,用于在各方之间作为 JSON 对象安全地传输信息。由于此信息经过数字签名,因此可以验证和信任。JWT 可以使用秘密(使用 HMAC 算法)或使用 RSA 或 ECDSA 的公钥/私钥对进行签名。


2、JWT 结构是什么样子的?

JSON Web Token 由用点 . 分隔的三个部分组成,它们是:


2.1、header(标题)

标头通常由两部分组成:令牌的类型,即 JWT,以及正在使用的签名算法,例如 HMAC SHA256 或 RSA。

{
  "alg": "HS256",
  "typ": "JWT"
}


然后,这个 JSON 被 Base64Url 编码以形成 JWT 的第一部分。



2.2、payload(有效载荷)

令牌的第二部分是负载,其中包含声明。声明是关于实体(通常是用户)和附加数据的声明。


共有三种类型的声明:


   注册声明:这些是一组预定义的声明,这些声明不是强制性的,而是推荐的,以提供一组有用的、可互操作的声明。其中一些是: iss(发行者)、 exp(到期时间)、 sub(主题)、 aud(受众)等。


   公共声明:这些可以由使用 JWT 的人随意定义。但是为了避免冲突,它们应该在 IANA JSON Web Token Registry 中定义,或者定义为包含抗冲突命名空间的 URI。


   私人声明:这些都是使用它们同意并既不是当事人之间建立共享信息的自定义声明注册或公众的权利要求。


一个示例有效载荷可能是:

{
  "sub": "1234567890",
  "name": "kaimo 313",
  "admin": true
}

然后对有效负载进行 Base64Url 编码以形成 JSON Web 令牌的第二部分。


注意点:


  • 声明名称只有三个字符,因为 JWT 是紧凑的。
  • 对于已签名的令牌,此信息虽然受到防篡改保护,但任何人都可以读取。除非加密,否则不要将机密信息放入 JWT 的负载或标头元素中。


2.3、signature(签名)

要创建签名部分,必须获取编码的标头、编码的有效载荷、秘密、标头中指定的算法,并对其进行签名。

例如,如果要使用 HMAC SHA256 算法,则签名将通过以下方式创建:

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



因此,JWT 通常如下所示。

xxxxx.yyyyy.zzzzz

f6a809b2555e4000bb73ab9078daabdf.png




3、JSON 网络令牌如何工作?


每当用户想要访问受保护的路由或资源时,用户代理应发送 JWT,通常在使用Bearer模式的Authorization标头中。标题的内容应如下所示:

Authorization: Bearer <token>


服务器的受保护路由将检查 Authorization 标头中的有效 JWT ,如果存在,则用户将被允许访问受保护的资源。


特别注意


secret 是保存在服务器端的,jwt 的签发生成也是在服务器端的,secret 就是用来进行jwt的签发和 jwt 的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个 secret, 那就意味着客户端是可以自我签发 wt 了。


参考资料:



解码、验证和生成 JWT

https://jwt.io/#debugger-io


2db609f73d0044519c283faa434db134.png




3、JWT 使用的场景


   授权:这是使用 JWT 最常见的场景。用户登录后,每个后续请求都将包含 JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是当今广泛使用 JWT 的一项功能,因为它的开销很小,并且能够轻松跨不同域使用。


   信息交换:JSON Web Token 是一种在各方之间安全传输信息的好方法。因为 JWT 可以被签名——例如,使用公钥/私钥对——你可以确定发件人就是他们所说的那样。此外,由于使用标头和有效负载计算签名,您还可以验证内容是否未被篡改。




















目录
相关文章
|
10月前
|
存储 Rust 安全
Rocket框架JWT鉴权实战:保护Rust Web API的安全方案​
本篇文章是基于rust语言和rocket依赖实现网页JWT认证和鉴权,完成简单的JWT token的验证和鉴权处理,使用cargo做依赖的导入和测试。
498 0
|
存储 JSON 安全
如何使用 JSON Web Tokens 进行身份验证?
总的来说,JWT 是一种强大而灵活的身份验证方式,通过正确使用和管理,可以为应用提供可靠的身份验证机制,同时提高系统的可扩展性和安全性。在实际应用中,需要根据具体的需求和场景,合理设计和实施 JWT 身份验证方案。
489 63
|
JSON 安全 Go
Go语言中使用JWT鉴权、Token刷新完整示例,拿去直接用!
本文介绍了如何在 Go 语言中使用 Gin 框架实现 JWT 用户认证和安全保护。JWT(JSON Web Token)是一种轻量、高效的认证与授权解决方案,特别适合微服务架构。文章详细讲解了 JWT 的基本概念、结构以及如何在 Gin 中生成、解析和刷新 JWT。通过示例代码,展示了如何在实际项目中应用 JWT,确保用户身份验证和数据安全。完整代码可在 GitHub 仓库中查看。
2654 1
|
存储 JSON 前端开发
JSON与现代Web开发:数据交互的最佳选择
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也便于机器解析和生成。它以文本格式存储数据,常用于Web应用中的数据传输,尤其是在客户端和服务器之间。
1279 1
|
JSON JavaScript 前端开发
Unexpected token u in JSON at position 0
这篇文章解释了JavaScript中"Unexpected token u in JSON at position 0"错误的常见原因,通常是由于尝试解析undefined变量导致的,并建议检查是否有变量在JSON.parse()执行时未赋值或值为undefined。
Unexpected token u in JSON at position 0
|
JSON Java API
解码Spring Boot与JSON的完美融合:提升你的Web开发效率,实战技巧大公开!
【8月更文挑战第29天】Spring Boot作为Java开发的轻量级框架,通过`jackson`库提供了强大的JSON处理功能,简化了Web服务和数据交互的实现。本文通过代码示例介绍如何在Spring Boot中进行JSON序列化和反序列化操作,并展示了处理复杂JSON数据及创建RESTful API的方法,帮助开发者提高效率和应用性能。
901 0
|
JSON Java API
【Azure Developer】如何验证 Azure AD的JWT Token (JSON Web 令牌)?
【Azure Developer】如何验证 Azure AD的JWT Token (JSON Web 令牌)?
576 0
|
前端开发 JavaScript
【Azure 环境】前端Web通过Azure AD获取Token时发生跨域问题(CORS Error)
【Azure 环境】前端Web通过Azure AD获取Token时发生跨域问题(CORS Error)
308 0
【Azure API 管理】在 Azure API 管理中使用 OAuth 2.0 授权和 Azure AD 保护 Web API 后端,在请求中携带Token访问后报401的错误
【Azure API 管理】在 Azure API 管理中使用 OAuth 2.0 授权和 Azure AD 保护 Web API 后端,在请求中携带Token访问后报401的错误
442 0
|
JSON 安全 Java
什么是JWT?如何使用Spring Boot Security实现它?
什么是JWT?如何使用Spring Boot Security实现它?
2498 5

热门文章

最新文章