golang前后端jwt对接
0x0 什么是jwt
JWT是JSON Web Token的缩写,可以用作授权认证。传统的授权认证一般采用session,由于session存储在服务端,加大了服务端的计算量,
而且多台服务器之间存在着session同步的问题。而JWT存储在客户端,不仅减少了服务端的计算量,而且天生支持分布式。
0x1 jwt的结构
JWT由三部分组成:
Header:头部,表明类型和加密算法
Claims:声明,即载荷(承载的内容)
Signature:签名,这一部分是将header和claims进行base64转码后,并用header中声明的加密算法加盐(secre)后构成。
即:
tmpstr = base64(header)+base64(claims)
signature = encrypt(tmpstr,secret)
最后三者用"."连接,即:
token = base64(header).base64(claims).signature
详细的介绍可以看jwt中文文档.
另外jwt官网有调试工具,可以辅助查错。
0x2 在web中如何使用
客户端发送登录请求(这个登录请求是不需要jwt验证的),在登录请求里返回token。
客户端把token保存起来,以后其它需要token的请求就在header里带上token。
0x3 实战
在echo框架中使用jwt
这里是官方文档和教程,说的比较清楚了。
我们仅需要在登录接口里生成jwt的token,并返回,jwt中间件会自动帮我们做jwt的验证。可以把先做分组路由,在分组里使用jwt中间件。
如果不使用框架,可以直接用jwt-go
配合axios.js
我们的前端使用了vue+axios,他嫌每次都拼接header麻烦,于是帮他在网上查了一下,可以配置axios为自动添加header。
axios的代码如下:参考了这篇博客
require('es6-promise').polyfill(); // 引入一次就行
import axios from 'axios';
// 创建 axios 实例
const Axios = axios.create({
baseURL: 'your base url',
timeout: 5000,
});
Axios.interceptors.request.use(
config => {
if (config.method === 'post') {
const formData = new FormData();
Object.keys(config.data).forEach(key => formData.append(key, config.data[key]));
config.data = formData;
}
if (config.url !="/login" && localStorage.token != undefined ){
config.headers.Authorization = 'Bearer ' + localStorage.token;
}
return config;
},
error => {
return Promise.reject(error);
}
);
Axios.interceptors.response.use(
res => {
return Promise.resolve(res);
},
error => {
return Promise.reject(error);
}
);
// 将 Axios 实例添加到Vue的原型对象上
export default {
install(Vue) {
Object.defineProperty(Vue.prototype, '$Axios', { value: Axios });
}
};
注意if (config.method === 'post') 这里是把post过去的数据转为表单,如果不加这一句,提交过去的是文本了,在服务器端无法用getpost(key)这种方式获取参数了。
0x4 调试
要善于利用官网调试工具,我便在jwt加密上掉坑里了。
加密时使用的是HS256,而验证时用的是HS512。
0x5 扩展
由于jwt载荷使用的是base64编码,可以很容易被破解,所以不要放入敏感信息,也不建议放入过多的信息。
jwt里可以存过期时间,所以可以用来做时效性的应用,而且不需要使用数据库。
另外也要避免jwt的重放攻击。
golang前后端jwt对接的更多相关文章
- DevOps 视角的前后端分离与实战
本文作者:CODING - 廖红坤 前言 随着微前端.微服务等技术理念和架构的蓬勃发展,我们已经没必要去讨论为什么要前后端分离这种话题,前后端分离已成为互联网项目开发的标准模式.前后端在各自的领域发展 ...
- JWT 在前后端分离中的应用与实践
关于前后端分离 前后端分离是一个很有趣的议题,它不仅仅是指前后端工程师之间的相互独立的合作分工方式,更是前后端之间开发模式与交互模式的模块化.解耦化.计算机世界的经验告诉我们,对于复杂的事物,模块化总 ...
- 从壹开始前后端分离[.NetCore] 37 ║JWT完美实现权限与接口的动态分配
缘起 本文已经有了对应的管理后台,地址:https://github.com/anjoy8/Blog.Admin 哈喽大家好呀!又过去一周啦,这些天小伙伴们有没有学习呀,已经有一周没有更新文章了,不过 ...
- 从壹开始前后端分离[.netCore 不定期 ] 36 ║解决JWT自定义中间件授权过期问题
缘起 哈喽,老张的不定期更新的日常又开始了,在咱们的前后端分离的.net core 框架中,虽然已经实现了权限验证<框架之五 || Swagger的使用 3.3 JWT权限验证[修改]>, ...
- 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十四║ Vuex + JWT 实现授权验证登录
壹周回顾 哈喽,又是元气满满的一个周一,又与大家见面了,周末就是团圆节了,正好咱们的前后端也要团圆了,为什么这么说呢,因为以后的开发可能就需要前后端一起了,两边也终于会师了,还有几天Vue系列就基本告 ...
- 基于前后端分离的身份认证方式——JWT
什么是JWT JWT--Json web token 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准,可实现无状态.分布式的Web应用授权. 现在一般都用redis来出来token做 ...
- 写在开始前---web前后端对接
现阶段接口对接问题: 1.接口乱,不清晰明了,无文档或文档过期 2.接口和业务不匹配.不可用 3.前后端沟通,工程复杂化 4.不能深入了解业务 5.任务延期 注:前后端对业务深入了解,接口之间都是有联 ...
- [django]前后端分离之JWT用户认证
在前后端分离开发时为什么需要用户认证呢?原因是由于HTTP协定是不储存状态的(stateless),这意味着当我们透过帐号密码验证一个使用者时,当下一个request请求时它就把刚刚的资料忘了.于是我 ...
- Spring Security + JWT实现前后端分离权限认证
现在国内前后端很多公司都在使用前后端分离的开发方式,虽然也有很多人并不赞同前后端分离,比如以下这篇博客就很有意思: https://www.aliyun.com/jiaocheng/650661.ht ...
随机推荐
- 使用Beetle简单构建高性能Socket tcp应用
beetle是基于c#编写的高性能Socket tcp组件,它基于SocketAsyncEventArgs的实现并提供了发送队列和接收队列的支持,可以根据情况灵活地设置1-N个发送队列和接收队列.除了 ...
- 【Android】Android动态加载Jar、APK的实现
本文介绍Android中动态加载Jar.APK的实现.而主要用到的就是DexClassLoader这个类.大家都知道Android和普通的Java虚拟机有差别,它只能加载经过处理的dex文件.而加载这 ...
- VM页面中遍历枚举类
1)自定义的枚举类如下所示: public enum BusType { MID_SMALL(1, "中小件"), FRESH(2, "生鲜"), GLOBAL ...
- MYSQL-使用mysqldump创建数据库快照
对已经有数据的mysql库创建主从的时候,可以使用mysqldump创建数据库快照 #--master-data选项会自动加上开启复制需要的"change master to"语句 ...
- C 语言整型谜题
如题,此篇文章是描述C语言中的整数谜题. 假定机器字长是32位的,用2的补码表示整数.对以下C表达式,请问它们在所有情况下都正确吗?如果不是,请给出反例. 初始化: 1 2 3 4 int x = f ...
- 实现一个简单的android开关
近期在学习android中的graphics中绘图系列.依照大神思路.找葫芦画瓢实现了一个开关.如图下: 记录一下实现方式: 1.画背景 上图形状.分成两个半圆与一个矩形,那么代码能够写成: priv ...
- SharePoint 2013 Step by Step—— 为终端用户提供故障恢复的解决方案 Part I
Disaster Recovery,我把他直译"故障恢复",或者也可以翻译成 "灾难复原 ".光字面意思就可以领会到,当SharePoint Server发生了 ...
- WinForm DataGridView新增加行
1.不显示最下面的新行 通常 DataGridView 的最下面一行是用户新追加的行(行头显示 * ).如果不想让用户新追加行即不想显示该新行,可以将 DataGridView 对象的 Allow ...
- Java 8 Stream – Read a file line by line
In Java 8, you can use Files.lines to read file as Stream. c://lines.txt – A simple text file for te ...
- python标准库介绍——32 Queue 模块详解
Queue 模块 ``Queue`` 模块提供了一个线程安全的队列 (queue) 实现, 如 [Example 3-2 #eg-3-2] 所示. 你可以通过它在多个线程里安全访问同个对象. ==== ...