前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >工具系列 | 前后端分离为何选择 jwt?

工具系列 | 前后端分离为何选择 jwt?

作者头像
Tinywan
发布2019-12-16 14:52:33
1.2K0
发布2019-12-16 14:52:33
举报
文章被收录于专栏:开源技术小栈开源技术小栈

为何选择 jwt?

最近几年 Restful API 及 SPA(单页面应用) 的盛行,cookie-session 的机制似乎越来越 不适合前后端分离的场景。

在分布式和微服务的趋势下,不少人选择在 redis 中存储 session 来达到单点登陆的效果,这无疑增加了成本和开发难度。

于是更多的人转而使用 jwt 来管理用户会话和授权,在 jwt官网介绍其两大使 用场景。

  • Authorization(授权):这是 jwt 应用最为广泛的场景。jwt 将数据加密存储,分发给前 端,前端将其放在特定的 header 字段 中(也有放在 params 和 body 中),服务器收 到请求后,解析 jwt 判断用户身份,对用户请求进行限权。
  • Information Exchange(数据交换): jwt 可以通过公钥和私钥对信息进行加密,双方通信 后,互得数据。

access_token 和 refresh_token

应用场景

在一般 jwt 应用中,access_tokenrefresh_token是一对相互帮助的好搭档,前面讲 到用户在前端登陆后,服务器会发送 access_tokenrefresh_token给前端,前端在得 到这两个 token之后必须谨慎存储。

access_token

用来用户鉴权,控制用户对接口,资源的访问。access_token 十分重要 ,它是服务器对前端有力控制的唯一途径,故一般其生存周期十分短,一般在 2 个小时 左右,更有甚者,其生命周期只有 15 分钟,默认 1 个小时。

refresh_token

用户通过登陆后获得 access_token,而 access_token的生命周期十 分短暂,但是用户登陆太频繁会严重影响体验,因此需要一种免登陆便能获取 access_token 的方式。refresh_token 主要用来解决该问题,refresh_token 的生命周 期较长,一般为 30 天左右,但 refresh_token 不能被用来用户身份鉴权和获取资源, 它只能被用来重新获取 access_token。当前端发现 access_token 过期时,便应通过 refresh_token 重新获取 access_token。

项目中的使用

用户通过用户名和密码获取 access_tokenrefresh_token

接口路由地址
代码语言:javascript
复制
http://{{iot_domain}}/api/v1/user/login
HTTP请求方式
代码语言:javascript
复制
POST
请求参数

参数

类型

必填

描述

范例

username

String(64)

用户名

demo

password

String(128)

密码

123456

请求案例

代码语言:javascript
复制
{
   "username": "demo",
   "password": "e10dcc75"
}

Postman 模拟请求

返回参数

返回字段

字段类型

描述

code

int

状态码

msg

string

错误信息

data

array

数据列表

返回案例

代码语言:javascript
复制
{
    "code": 200,
    "msg": "请求成功",
    "data": {
        "access_token": "eyJ0eXAiOiJKV1QiL...CJhbGciOiJIUzI1hXc",
        "refresh_token": "eyJ0eXAiOiJKV1sz...A_Pcqa1kD-Nb9UNLhck"
    }
}
使用

在请求其他资源或接口时在 header中,加入Authorization字段,字段值为Bearer加 上access_token注意两个字段中间必须有一个空格,如下:

代码语言:javascript
复制
Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1MzU1MzMyNjMsIm5iZiI6MTUzNTUzMzI2MywianRpIjoiMTlkZWUwNzQtNzUxYi00MjBlLTk3NjAtZDRkMzc3YjdjMjUyIiwiZXhwIjoxNTM1NjE5NjYzLCJpZGVudGl0eSI6InBlZHJvIiwiZnJlc2giOmZhbHNlLCJ0eXBlIjoiYWNjZXNzIn0.9sNmAV5anxY5N1S1kaXzRRpdjzVX3fX6iI0ZjxGiiVs

服务器会解析该字段并得到用户信息,对用户进行鉴权。

refresh_token 获取 access_token
接口路由地址
代码语言:javascript
复制
http://{{iot_domain}}/api/v1/user/refresh
HTTP请求方式
代码语言:javascript
复制
GET
请求参数

注意在 Authorization 中加上 refresh_token

Postman 模拟请求

返回案例

代码语言:javascript
复制
{
    "code": 200,
    "msg": "请求成功",
    "data": {
        "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ3aW90LmZycC50aW55d2FuLnRvcCIsImlhdCI6MTU3NjAyNzY4NiwiZXhwIjoxNTc2MDM0ODg2LCJ1c2VyIjp7ImlkIjoyNSwidXNlcm5hbWUiOiJkZW1vIiwic3RhdHVzIjoxLCJjcmVhdGVfdGltZSI6IjIwMTktMDktMTMgMjI6NDE6MjUiLCJ1cGRhdGVfdGltZSI6IjIwMTktMTItMDEgMTI6MDU6MDMiLCJkZWxldGVfdGltZSI6MCwibG9naW5fdGltZSI6MTU2ODQyMDM0OCwibG9naW5faXAiOiIxMTUuMTkzLjE3Mi4yMDAiLCJncm91cF9pZCI6MiwibW9ibGllIjoiIiwibmlja25hbWUiOiIiLCJhdmF0YXIiOm51bGwsImVtYWlsIjoiIn19.NR5bD4Z7NNqUsCg1B3FwWswEnSfHbcbE-KBLrIH2AcE"
    }
}

用户获取资源时,Authorization 字段的值为 Bearer加上 access_token,当通过 refresh_token 获取 access_token 时,应将 Authorization 中的 access_token 替换为 refresh_token,如:

代码语言:javascript
复制
Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1MzU1MzMyNjMsIm5iZiI6MTUzNTUzMzI2MywianRpIjoiYjU0OWIwZGEtMTE3MS00NzJlLWE0MDMtMDFkMGRkZTRjOTYzIiwiZXhwIjoxNTM4MTI1MjYzLCJpZGVudGl0eSI6InBlZHJvIiwidHlwZSI6InJlZnJlc2gifQ.cBnqEBnome-dMFEueQ8oCJfoXX9_mzQJAGjyeq4bYh8

服务器会解析该字段,如 refresh_token 字段未过期则会发送新的 access_token。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Tinywan的杂货摊 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为何选择 jwt?
  • access_token 和 refresh_token
    • 应用场景
      • access_token
        • refresh_token
        • 项目中的使用
          • refresh_token 获取 access_token
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档