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 使用的更多相关文章

  1. golang web实战之二(iris)

    之前写了一篇为:golang web实战之一(beego,mvc postgresql) 听说iris更好: 1.  iris hello world package main import &quo ...

  2. 看图理解JWT如何用于单点登录

    单点登录是我比较喜欢的一个技术解决方案,一方面他能够提高产品使用的便利性,另一方面他分离了各个应用都需要的登录服务,对性能以及工作量都有好处.自从上次研究过JWT如何应用于会话管理,加之以前的项目中也 ...

  3. 在配有英特尔® Iris™ 显卡的系统上通过优化对 Just Cause 3 进行增强

    高端 PC 继续通过高性能显卡驱动桌面游戏. 一流的"梦想机器"基于第六代智能 英特尔® 酷睿™ 处理器i7-6700K等 CPU,通常与高端独立显卡配合使用以运行要求最严苛的游戏 ...

  4. JWT实现token-based会话管理

    上文<3种web会话管理的方式>介绍了3种会话管理的方式,其中token-based的方式有必要从实现层面了解一下.本文主要介绍这方面的内容.上文提到token-based的实现目前有一个 ...

  5. 用JWT来保护我们的ASP.NET Core Web API

    在上一篇博客中,自己动手写了一个Middleware来处理API的授权验证,现在就采用另外一种方式来处理这个授权验证的问题,毕竟现在也 有不少开源的东西可以用,今天用的是JWT. 什么是JWT呢?JW ...

  6. Laravel-lumen 配置JWT

    具体步骤参照: [ JWT & Lumen ] 第一步 在项目根目录 执行命令 composer require tymon/jwt-auth第二步 在 bootstrap/app.php 的 ...

  7. .net core Jwt 添加

    Jwt 已经成为跨平台身份验证通用方案,如不了解请关注:https://jwt.io/. 为了和微软其他验证模块有个比较好的衔接,项目中采用了微软开发的jwt组件: System.IdentityMo ...

  8. IRIS数据集的分析-数据挖掘和python入门-零门槛

    所有内容都在python源码和注释里,可运行! ########################### #说明: # 撰写本文的原因是,笔者在研究博文“http://python.jobbole.co ...

  9. 多说评论系统API调用和本地身份说明(JWT)

    多说评论系统是一个非常好用的第三方评论插件,聚合了大多数的SNS平台账号登录和分享功能,UI也很不错. 作为网站快速接入评论系统,多说是一个比较好的选择,其也提供了一些实用的API去满足定制化需求. ...

随机推荐

  1. Java基础11:Java泛型详解

    本文对java的泛型的概念和使用做了详尽的介绍. 本文参考https://blog.csdn.net/s10461/article/details/53941091 具体代码在我的GitHub中可以找 ...

  2. 当面试官说 “你还有什么问题想问的” ,你该如何回答?

    阅读本文大概需要 4 分钟. 作者:黄小斜 来源:程序员江湖 程序员面试时经常会听到面试官说一些套话,比如"今天的面试就到这里了,回去等通知吧","你还有什么问题想问我的 ...

  3. Django中的templates(你的HTML页面放哪里)

    本文回答Django里面的HTML文件应该怎么放,以及Django是如何查找模板文件的. 到目前为止我们没有使用HTML页面,在之前的说明中所有内容都是写死在程序里的,如果你想改变内容就要修改代码.但 ...

  4. Linux常用监控命令简介 – vmstat,ps,free,uptime 等

    vmstat [-a] [-n] [delay [ count]]vmstat [-f] [-s] [-m]vmstat [-S unit]vmstat [-d]vmstat [-p disk par ...

  5. Linux svn checkout时候总报设备上没有空间

    详细报错信息:svn: 不能打开文件“weibosearch2.0.0/.svn/lock”: 设备上没有空间 但是df -h查看磁盘[root@picdata-1-2 data]# df -h文件系 ...

  6. 分享几个有趣的Linux命令

    前言 最近工作比较忙,没时间写博客,这次介绍几个有趣的Linux命令. 命令:sl 当你使用这个命令时会看到一辆小火车从你的屏幕经过.亲测! 安装命令如下: yum -y install sl 执行效 ...

  7. Using rqt_console and roslaunch

    Description: This tutorial introduces ROS using rqt_console and rqt_logger_level for debugging and r ...

  8. 【EF】CodeFirst Fluent API使用记录

    我们在使用EF CodeFirst 模式生成数据库的时候进行表的代码映射关系可以采用注解模式和Fluent API模式.这里就是记录一下使用Fluent API进行表关系映射的方法. 注解模式: 回顾 ...

  9. C# 操作Excel图形——绘制、读取、隐藏、删除图形

    简介 本篇文章将介绍C# 如何处理Excel图形相关的问题,包括以下内容要点: 1.绘制图形 1.1 绘制图形并添加文本到图形 1.2 添加图片到图形 1.3 设置图形阴影效果 1.4 设置图形透明度 ...

  10. Mybatis框架基础支持层——反射工具箱之对象工厂ObjectFactory&DefaultObjectFactory(5)

    ObjectFactory官方简介:MyBatis每次创建结果集对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成. 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认 ...