Iris jwt 使用
jwt分为三个部分:
1、header,用来存储算法和token类型等信息
2、payload, 一些简单的信息
3、签名,来验证token是否合法
iris-jwt
这是初始化jwt中间件的配置参数。
type Config struct {
ValidationKeyGetter jwt.Keyfunc
// 用来设置请求中通过那个key获取Token,默认是 "jwt", user := ctx.Values().Get("jwt").(*jwt.Token)
ContextKey string
ErrorHandler errorHandler
CredentialsOptional bool
Extractor TokenExtractor
Debug bool
EnableAuthOnOptions bool
SigningMethod jwt.SigningMethod
// 是否验证过期时间,如果为true,则验证Claims中的exp字段。
Expiration bool
}
初始化jwt中间件:
jwtHandler := jwtmiddleware.New(jwtmiddleware.Config{
ValidationKeyGetter: func(token *jwt.Token) (interface{}, error) {
return []byte("My Secret"), nil
},
SigningMethod: jwt.SigningMethodHS256,
})
使用中间件:
needauth := app.Party("/auth", jwtHandler.Serve)
{ // /auth路径下所有的请求都需要jwt验证
needauth.Get("/ping", myHandler)
}
验证过程:
1、token可以设置从Header中获取FromAuthHeader(ctx context.Context), 也可以从Parameter获取FromParameter(param string) TokenExtractor, 也可以自定义一个,还可以对加密过的token解密等。
2、获取完token之后,此时token是个字符串,未经过验证,也为未成对象。解析成对象之后,通过keyFun返回的的key验证token,返回token对象。最后执行ctx.Values().Set(m.Config.ContextKey, parsedToken)将解析完的token放到jwt这个key中。
上面说的keyFun:
jwtHandler := jwtmiddleware.New(jwtmiddleware.Config{
ValidationKeyGetter: func(token *jwt.Token) (interface{}, error) {
return []byte("My Secret"), nil
},
SigningMethod: jwt.SigningMethodHS256,
})
这个方法接收Token对象,返回一个用于验证token的key。这里会有什么骚操作呢,好像可以拿到Token胡搞一番,返回一个key。作者的目的好像是可以根据token返回不同的key。
这里可能为了避免token被盗,使用动态的key,key值可以通过token的时间来生成, 快过期了重新生成新的key。
每次生成新的token都需要用户名和密码,用户名和密码保存在js中,浏览器关闭,并且token过期后则需要重新登陆。即使token被盗,时间也不会太久。
由于js中保存了用户名和密码,即使token过期了,也能重新生成token。
或者使用ip认证也可以。
3、检查完了之后进入下一个中间件,或者Handler。
设置token的过程:
1、生成token对象,然后签名,完了。
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"useewhat": "eyJ1c2Vld2hhdCI6IiJ9",
})
tokenString, _ := token.SignedString([]byte("My Secret"))
ctx.Header("Authorization", "bearer "+tokenString)
// Claims也可以是: jwt.StandardClaims
type StandardClaims struct {
Audience string `json:"aud,omitempty"`
ExpiresAt int64 `json:"exp,omitempty"`
Id string `json:"jti,omitempty"`
IssuedAt int64 `json:"iat,omitempty"`
Issuer string `json:"iss,omitempty"`
NotBefore int64 `json:"nbf,omitempty"`
Subject string `json:"sub,omitempty"`
}
安全性
由于jwt的payload部分也是可见的,可以把信息加密后再放到Claims中,获取到Claims后,再通过一个中间件解密。
也可以把上面的tokenString的payload部分加密, 收到请求后,自定义一个FromAuthHeader来解密payload部分。
过期时间
处于安全考虑,可以设置一个固定的时间,不进行更新jwt。过期了之后需要重新登陆。可能会出现用户用着的时候突然退出登陆的情况。
也可以更新token,不过如果token被盗之后很难回收。因为key是固定的。啊,想到骚操作了。返回上面的文档。
下面是一个写的惨不忍睹的例子:
import (
"github.com/kataras/iris"
"github.com/dgrijalva/jwt-go"
jwtmiddleware "github.com/iris-contrib/middleware/jwt"
)
type Response struct {
Text string `json:"text"`
}
func main() {
app := iris.New()
myHandler := func(ctx iris.Context) {
user := ctx.Values().Get("jwt").(*jwt.Token)
ctx.Writef("This is an authenticated request\n")
ctx.Writef("Claim content:\n")
ctx.Writef("%s", user.Signature)
}
jwtHandler := jwtmiddleware.New(jwtmiddleware.Config{
ValidationKeyGetter: func(token *jwt.Token) (interface{}, error) {
return []byte("My Secret"), nil
},
SigningMethod: jwt.SigningMethodHS256,
})
getjwt := func(ctx iris.Context) {
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"useewhat": "我已经加过密了,你看不到",
})
tokenString, _ := token.SignedString([]byte("My Secret"))
ctx.Header("Authorization", "bearer "+tokenString)
response := "Get it"
ctx.JSON(response)
}
needauth := app.Party("/", jwtHandler.Serve)
{
needauth.Get("/ping", myHandler)
}
app.Get("/getjwt", getjwt)
app.Run(iris.Addr("localhost:3001"))
}
Iris jwt 使用的更多相关文章
- golang web实战之二(iris)
之前写了一篇为:golang web实战之一(beego,mvc postgresql) 听说iris更好: 1. iris hello world package main import &quo ...
- 看图理解JWT如何用于单点登录
单点登录是我比较喜欢的一个技术解决方案,一方面他能够提高产品使用的便利性,另一方面他分离了各个应用都需要的登录服务,对性能以及工作量都有好处.自从上次研究过JWT如何应用于会话管理,加之以前的项目中也 ...
- 在配有英特尔® Iris™ 显卡的系统上通过优化对 Just Cause 3 进行增强
高端 PC 继续通过高性能显卡驱动桌面游戏. 一流的"梦想机器"基于第六代智能 英特尔® 酷睿™ 处理器i7-6700K等 CPU,通常与高端独立显卡配合使用以运行要求最严苛的游戏 ...
- JWT实现token-based会话管理
上文<3种web会话管理的方式>介绍了3种会话管理的方式,其中token-based的方式有必要从实现层面了解一下.本文主要介绍这方面的内容.上文提到token-based的实现目前有一个 ...
- 用JWT来保护我们的ASP.NET Core Web API
在上一篇博客中,自己动手写了一个Middleware来处理API的授权验证,现在就采用另外一种方式来处理这个授权验证的问题,毕竟现在也 有不少开源的东西可以用,今天用的是JWT. 什么是JWT呢?JW ...
- Laravel-lumen 配置JWT
具体步骤参照: [ JWT & Lumen ] 第一步 在项目根目录 执行命令 composer require tymon/jwt-auth第二步 在 bootstrap/app.php 的 ...
- .net core Jwt 添加
Jwt 已经成为跨平台身份验证通用方案,如不了解请关注:https://jwt.io/. 为了和微软其他验证模块有个比较好的衔接,项目中采用了微软开发的jwt组件: System.IdentityMo ...
- IRIS数据集的分析-数据挖掘和python入门-零门槛
所有内容都在python源码和注释里,可运行! ########################### #说明: # 撰写本文的原因是,笔者在研究博文“http://python.jobbole.co ...
- 多说评论系统API调用和本地身份说明(JWT)
多说评论系统是一个非常好用的第三方评论插件,聚合了大多数的SNS平台账号登录和分享功能,UI也很不错. 作为网站快速接入评论系统,多说是一个比较好的选择,其也提供了一些实用的API去满足定制化需求. ...
随机推荐
- 使用MQ来保证分布式事务的最终一致性
前言 之前我们讨论了如何拆分一个订单下单的一个服务(https://www.cnblogs.com/linkstar/p/9610268.html) 从单体到微服务的拆分,当时我们只是对原来的整个服务 ...
- MaxCompute安全管理指南-基础篇
背景及目的 方便和辅助MaxCompute的project owner或安全管理员进行project的日常安全运维,保障数据安全. MaxCompute有安全模型,DataWorks也有安全模型,当通 ...
- Shell从入门到精通进阶之二:Shell字符串处理之${}
上一章节讲解了为什么用${}引用变量,${}还有一个重要的功能,就是文本处理,单行文本基本上可以满足你所有需求. 2.1 获取字符串长度 # VAR='hello world!' # echo $VA ...
- 流式大数据计算实践(7)----Hive安装
一.前言 1.这一文学习使用Hive 二.Hive介绍与安装 Hive介绍:Hive是基于Hadoop的一个数据仓库工具,可以通过HQL语句(类似SQL)来操作HDFS上面的数据,其原理就是将用户写的 ...
- Centos 7.0 zabbix 部署
1.LAMP 环境搭建 初次安装可以先关闭selinux 和 firewall [root@localhost ~]# setenforce [root@localhost ~]# systemctl ...
- [.NET] 《Effective C#》快速笔记(一)- C# 语言习惯
<Effective C#>快速笔记(一)- C# 语言习惯 目录 一.使用属性而不是可访问的数据成员 二.使用运行时常量(readonly)而不是编译时常量(const) 三.推荐使用 ...
- C# asp.net mvc 通过 HttpClient 访问 Web_API
//MVC 具体方法 //API地址 通过 WebConfig配置 private static string apiAdds = ConfigurationManager.AppSettings[& ...
- JavaScript是如何工作的:编写自己的Web开发框架 + React及其虚拟DOM原理
这是专门探索 JavaScript 及其所构建的组件的系列文章的第 19 篇. 如果你错过了前面的章节,可以在这里找到它们: JavaScript 是如何工作的:引擎,运行时和调用堆栈的概述! Jav ...
- python运行逻辑
Python程序在解释器上执行分两个过程: 编译:如果Python进程在机器上拥有写入权限,那么它会把程序的字节码保存为一个以 .pyc 为扩展名的文件.当程序运行后,会在源代码的同一个目录下看到 . ...
- [JS设计模式]:构造函数模式(2)
基本用法 function Car(model, year, miles) { this.model = model; this.year = year; this.miles = miles; th ...