JWT 简介


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

详细内容可以参考这篇文章:什么是 JWT (opens new window)。

¶认证流程


¶用户认证的流程

  • 用户使用账号(手机/邮箱/用户名)密码请求服务器

  • 服务器验证用户账号是否和数据库匹配

  • 服务器通过验证后发送给客户端一个 JWT Token

  • 客户端存储 Token,并在每次请求时携带该 Token(如何携带?)

  • 服务端验证 Token 值,并根据 Token 合法性返回对应资源(如何验证?)

¶安全限制


为防止用户恶意注册,系统对 IP 默认进行了限制,条件如下:

  • 单 IP 5 分钟内连续注册超过 3 次会被禁止;

  • 单 IP 5 分钟内连续登录失败超过 3 次会要求输入验证码;

你可以自定义时间范围和该时间段内次数的阈值。

若想开启/关闭或修改此限制,请参考:开启/关闭/配置注册频率限制。

¶客户端附带 JWT Token 的方式


用户在完成认证后会返回开发者一个 JWT Token,开发者需将此 Token 存储于客户端,然后将此 Token 发送给开发者受限的后端服务器进行验证。

建议使用 HTTP Header Authorization 的形式携带 Token,以下以 JavaScript 的 axios 库为例示范如何携带:

const axios =require("axios");
axios.get({url:"https://yourdomain.com/api/v1/your/resources",headers:{Authorization:"Bearer ID_TOKEN",},}).then((res)=>{// custom codes});复制成功

注意第五行前面有 Bearer 类型。

¶什么是 Bearer?

Bearer Token (RFC 6750 (opens new window)) 用于授权访问资源,任何 Bearer 持有者都可以无差别地用它来访问相关的资源,而无需证明持有加密 key。一个 Bearer 代表授权范围、有效期,以及其他授权事项;一个 Bearer 在存储和传输过程中应当防止泄露,需实现 Transport Layer Security (TLS);一个 Bearer 有效期不能过长,过期后可用 Refresh Token 申请更新。

建议开发者遵循规范,在每次请求的 Token 前附带 Bearer。

什么是 ID Token

在 OIDC 协议中,你会遇到三种 Token: id_token, access_token 和 refresh_token。本文会介绍什么是 ID Token,你也可以分别阅读:

  • 什么是 Access Token

  • 什么是 Refresh Token

OIDC (OpenID Connect) 协议 (opens new window)对 OAuth 2.0 协议 (opens new window)最主要的一个扩展就是 ID Token 数据结构。ID Token 相当于用户的身份凭证,开发者的前端访问后端接口时可以携带 ID Token,开发者服务器可以校验用户的 ID Token 以确定用户身份,验证通过后返回相关资源。

ID Token 本质上是一个 JWT Token,包含了该用户身份信息相关的 key/value 键值对,例如:

{"iss":"https://server.example.com","sub":"24400320",// subject 的缩写,为用户 ID"aud":"s6BhdRkqt3","nonce":"n-0S6_WzA2Mj","exp":1311281970,"iat":1311280970,"auth_time":1311280969,"acr":"urn:mace:incommon:iap:silver"}复制成功

ID Token 本质上是一个 JWT Token 意味着:

  • 用户的身份信息直接被编码进了 id_token,你不需要额外请求其他的资源来获取用户信息;

  • id_token 可以验证其没有被篡改过,详情请见如何验证 ID Token。

¶ID Token 完整字段含义


字段名

翻译

sub

subject 的缩写,唯一标识,一般为用户 ID

name

姓名

given_name

名字

family_name

姓氏

middle_name

中间名

nickname

昵称

preferred_username

希望被称呼的名字

profile

基础资料

picture

头像

website

网站链接

email

电子邮箱

email_verified

邮箱是否被认证

gender

性别

birthdate

生日

zoneinfo

时区

locale

区域

phone_number

手机号

phone_number_verified

认证手机号

address

地址

formatted

详细地址

street_address

街道地址

locality

城市

region

postal_code

邮编

country

国家

updated_at

信息更新时间

参考 OIDC 规范

什么是 Access Token

Access Token 用于基于 Token 的认证模式,允许应用访问一个资源 API。用户认证授权成功后,Authing 会签发 Access Token 给应用。应用需要携带 Access Token 访问资源 API,资源服务 API 会通过拦截器查验 Access Token 中的 scope 字段是否包含特定的权限项目,从而决定是否返回资源。

如果你的用户通过社交账号登录,例如微信登录,微信作为身份提供商会颁发自己的 Access Token,你的应用可以利用 Access Token 调用微信相关的 API。这些 Access Token 是由社交账号服务方控制的,格式也是任意的。

¶Opaque Access Token


Opaque Access Token 是一串随机字符串,从中不能获取到任何信息,你需要将它发送到服务器进行解析。只能通过将 Token 发到服务器的方式来验证 Opaque Access Token。

¶JWT Access Token


JWT 全称为 JSON Web Token (opens new window),遵循 JWT 标准。JWT 中包含了主体、受众、权限、颁发时间、过期时间、用户信息字段等内容且具备签名,不可篡改。因此无需发送到服务器,可以本地验证。Authing 在大多数情况下使用此种格式的 Token。

¶Access Token 示例


eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjF6aXlIVG15M184MDRDOU1jUENHVERmYWJCNThBNENlZG9Wa3VweXdVeU0ifQ.eyJqdGkiOiIzWUJ5eWZ2TDB4b01QNXdwTXVsZ0wiLCJzdWIiOiI2MDE5NDI5NjgwMWRjN2JjMmExYjI3MzUiLCJpYXQiOjE2MTI0NDQ4NzEsImV4cCI6MTYxMzY1NDQ3MSwic2NvcGUiOiJvcGVuaWQgZW1haWwgbWVzc2FnZSIsImlzcyI6Imh0dHBzOi8vc3RlYW0tdGFsay5hdXRoaW5nLmNuL29pZGMiLCJhdWQiOiI2MDE5M2M2MTBmOTExN2U3Y2IwNDkxNTkifQ.cYyZ6buwAjp7DzrYQEhvz5rvUBhkv_s8xzuv2JHgzYx0jbqqsWrA_-gufLTFGmNkZkZwPnF6ktjvPHFT-1iJfWGRruOOMV9QKPhk0S5L2eedtbKJU6XIEkl3F9KbOFwYM53v3E7_VC8RBj5IKqEY0qd4mW36C9VbS695wZlvMYnmXhIopYsd5c83i39fLBF8vEBZE1Rq6tqTQTbHAasR2eUz1LnOqxNp2NNkV2dzlcNIksSDbEGjTNkWceeTWBRtFMi_o9EWaHExdm5574jQ-ei5zE4L7x-zfp9iAe8neuAgTsqXOa6RJswhyn53cW4DwWg_g26lHJZXQvv_RHZRlQ复制成功

解析后的内容:

{"jti":"3YByyfvL0xoMP5wpMulgL","sub":"60194296801dc7bc2a1b2735",// subject 的缩写,为用户 ID"iat":1612444871,"exp":1613654471,"scope":"openid email message","iss":"https://steam-talk.authing.cn/oidc","aud":"60193c610f9117e7cb049159"}

什么是 Refresh Token

AccessToken 和 IdToken 是 JSON Web Token (opens new window),有效时间通常较短。通常用户在获取资源的时候需要携带 AccessToken,当 AccessToken 过期后,用户需要获取一个新的 AccessToken。

Refresh Token 用于获取新的 AccessToken。这样可以缩短 AccessToken 的过期时间保证安全,同时又不会因为频繁过期重新要求用户登录。

用户在初次认证时,Refresh Token 会和 AccessToken、IdToken 一起返回。你的应用必须安全地存储 Refresh Token,它的重要性和密码是一样的,因为 Refresh Token 能够一直让用户保持登录。

以下是 Token 端点返回的 Refresh Token:

{"access_token":"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6InIxTGtiQm8zOTI1UmIyWkZGckt5VTNNVmV4OVQyODE3S3gwdmJpNmlfS2MifQ.eyJqdGkiOiJ4R01uczd5cmNFckxiakNRVW9US1MiLCJzdWIiOiI1YzlmNzVjN2NjZjg3YjA1YTkyMWU5YjAiLCJpc3MiOiJodHRwczovL2F1dGhpbmcuY24iLCJpYXQiOjE1NTQ1Mzc4NjksImV4cCI6MTU1NDU0MTQ2OSwic2NvcGUiOiJvcGVuaWQgcHJvZmlsZSBvZmZsaW5lX2FjY2VzcyBwaG9uZSBlbWFpbCIsImF1ZCI6IjVjYTc2NWUzOTMxOTRkNTg5MWRiMTkyNyJ9.wX05OAgYuXeYM7zCxhrkvTO_taqxrCTG_L2ImDmQjMml6E3GXjYA9EFK0NfWquUI2mdSMAqohX-ndffN0fa5cChdcMJEm3XS9tt6-_zzhoOojK-q9MHF7huZg4O1587xhSofxs-KS7BeYxEHKn_10tAkjEIo9QtYUE7zD7JXwGUsvfMMjOqEVW6KuY3ZOmIq_ncKlB4jvbdrduxy1pbky_kvzHWlE9El_N5qveQXyuvNZVMSIEpw8_y5iSxPxKfrVwGY7hBaF40Oph-d2PO7AzKvxEVMamzLvMGBMaRAP_WttBPAUSqTU5uMXwMafryhGdIcQVsDPcGNgMX6E1jzLA","expires_in":3600,"id_token":"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6InIxTGtiQm8zOTI1UmIyWkZGckt5VTNNVmV4OVQyODE3S3gwdmJpNmlfS2MifQ.eyJzdWIiOiI1YzlmNzVjN2NjZjg3YjA1YTkyMWU5YjAiLCJub25jZSI6IjIyMTIxIiwiYXRfaGFzaCI6Ik5kbW9iZVBZOEFFaWQ2T216MzIyOXciLCJzaWQiOiI1ODM2NzllNC1lYWM5LTRjNDEtOGQxMS1jZWFkMmE5OWQzZWIiLCJhdWQiOiI1Y2E3NjVlMzkzMTk0ZDU4OTFkYjE5MjciLCJleHAiOjE1NTQ1NDE0NjksImlhdCI6MTU1NDUzNzg2OSwiaXNzIjoiaHR0cHM6Ly9hdXRoaW5nLmNuIn0.IQi5FRHO756e_eAmdAs3OnFMU7QuP-XtrbwCZC1gJntevYJTltEg1CLkG7eVhdi_g5MJV1c0pNZ_xHmwS0R-E4lAXcc1QveYKptnMroKpBWs5mXwoOiqbrjKEmLMaPgRzCOdLiSdoZuQNw_z-gVhFiMNxI055TyFJdXTNtExt1O3KmwqanPNUi6XyW43bUl29v_kAvKgiOB28f3I0fB4EsiZjxp1uxHQBaDeBMSPaRVWQJcIjAJ9JLgkaDt1j7HZ2a1daWZ4HPzifDuDfi6_Ob1ZL40tWEC7xdxHlCEWJ4pUIsDjvScdQsez9aV_xMwumw3X4tgUIxFOCNVEvr73Fg","refresh_token":"WPsGJbvpBjqXz6IJIr1UHKyrdVF","scope":"openid profile offline_access phone email","token_type":"Bearer"}复制成功

应用携带 Refresh Token 向 Token 端点发起请求时,Authing 每次都会返回相同的 Refresh Token 和新的 AccessToken、IdToken,直到 Refresh Token 过期。

JWT Token、ID Token、Access Token、Refresh Token相关推荐

  1. 基于 JWT + Refresh Token 的用户认证实践

    HTTP 是一个无状态的协议,一次请求结束后,下次在发送服务器就不知道这个请求是谁发来的了(同一个 IP 不代表同一个用户),在 Web 应用中,用户的认证和鉴权是非常重要的一环,实践中有多种可用方案 ...

  2. 使用identity+jwt保护你的webapi(三)——refresh token

    前言 上一篇已经介绍了identity的注册,登录,获取jwt token,本篇来完成refresh token. 开始 开始之前先说明一下为什么需要refresh token. 虽然jwt toke ...

  3. 为什么 OAuth 里除了 Access Token 之外,还需要 Refresh Token?

    What is the purpose of a "Refresh Token"? 问题:我有一个与 YouTube Live Streaming API 集成的程序.我以每 50 ...

  4. 多态和接口(7)——Access操作步骤、.Net中访问Access

    一.Access操作步骤 1.新建Access文件的方法:文件→新建,右侧选择"空数据库",选择mdb文件保存路径.在打开的设计器中"表"→"使用设计 ...

  5. Access Token vs Id Token

    Access Token vs Id Token Access Token Id Token 与身份相关的 Token 有两种:Access Token 和 Id Token. Access Toke ...

  6. 【OAuth2】十六、Spring Authorization Server如何生成并发放token的

    这里写目录标题 前言 一.OAuth2TokenEndpointConfigurer 1.关于authenticationProvider和authenticationProviders自定义的注意 ...

  7. nodejs typescript怎么发送get、post请求,如何获取网易云通信token

    nodejs typescript怎么发送get.post请求,如何获取网易云通信token yarn add jshashes yarn add superagent 检查语法 yarn lint ...

  8. 不要用JWT替代session管理(上):全面了解Token,JWT,OAuth,SAML,SSO

    通常为了弄清楚一个概念,我们需要掌握十个概念.在判断 JWT (Json Web Token) 是否能代替 session 管理之前,我们要了解什么是 token,以及 access token 和 ...

  9. Access Token 与 Refresh Token【转载哒科普啊】

    Access Token 与 Refresh Token access token 是客户端访问资源服务器的令牌.拥有这个令牌代表着得到用户的授权.然而,这个授权应该是临时的,有一定有效期.这是因为, ...

最新文章

  1. python病毒扫描器_基于Python的病毒扫描机制
  2. HDU 4358 树状数组+思路
  3. java计算代码执行时间
  4. 【错误记录】发布 Flutter 插件包报错 ( Failed to upload the package.pub finished with exit code 1 )
  5. C# winform自己实现Windows消息处理
  6. window连接不上linux ftp_xftp怎么连linux,教你xftp怎么连linux
  7. 【linux】查看字体
  8. 6号板编译失败找不到arm-none-linux-gnueabi-gcc
  9. JDBC学习笔记(6)——获取自动生成的主键值处理Blob数据库事务处理
  10. 移植最新版libmemcached到VC++的艰苦历程和经验总结(上)
  11. 程序员必备的一些数学基础知识
  12. 内码输入法手机版下载_内码输入法
  13. 空降的技术管理者应该如何开展工作?
  14. 如何评价区块链论文?区块链相关学术会议级别大科普
  15. hive项目之微博ETL项目总结分析
  16. 机器学习笔记-多分类学习,类别不平衡,决策树
  17. 【二叉树的遍历-3】后序遍历(递归与非递归)
  18. 异地远程群晖NAS教程【cpolar内网穿透】
  19. Unity Content Size Fitter 刷新不及时
  20. 删除docker里的的容器

热门文章

  1. java 类可见性_Java学习笔记(类的可见性)
  2. PID 控制保姆级培训教程下-全国大学生电子设计大赛赛前必备
  3. 计算机网络——第二章(应用层)
  4. python 基础知识点 (一)
  5. UID-( Unique Identifiers ) 唯一标志值的解释
  6. 织梦Dede如何删除管理员admin
  7. 移动了我的文档,但剩下了一个Documents文件夹,怎么也删不掉,怎么办?
  8. html表单验证方法,简述HTML交互式表单验证方法
  9. SLAM专题(6)-- 非线性优化
  10. Python爬虫圈最能打的专栏教程,《Python爬虫120例》教程导航帖(2023.2.6更新)