golang 中jwt使用方式总结。

1. golang示例代码

import (
"fmt" "time" "github.com/dgrijalva/jwt-go"
) var (
SIGN_NAME_SCERET = "aweQurt178BNI"
) func main() {
fmt.Println("Hello World!") tokenString, err := createJwt()
if err != nil {
fmt.Println(err.Error())
return
} fmt.Println(tokenString) claims := parseJwt(tokenString)
fmt.Println(claims) } //验证
//在调用Parse时,会进行加密验证,同时如果提供了exp,会进行过期验证;
//如果提供了iat,会进行发行时间验证;如果提供了nbf,会进行发行时间验证. //创建 tokenString
func createJwt() (string, error) {
// token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
// "foo": "bar",
// "nbf": time.Date(2015, 10, 10, 12, 0, 0, 0, time.UTC).Unix(), // }) token := jwt.New(jwt.SigningMethodHS256)
claims := make(jwt.MapClaims)
claims["foo"] = "bar"
claims["exp"] = time.Now().Add(time.Hour * time.Duration(1)).Unix()
claims["iat"] = time.Now().Unix()
token.Claims = claims // Sign and get the complete encoded token as a string using the secret
tokenString, err := token.SignedString([]byte(SIGN_NAME_SCERET))
return tokenString, err
} //解析tokenString
func parseJwt(tokenString string) jwt.MapClaims {
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
// Don't forget to validate the alg is what you expect:
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
} // hmacSampleSecret is a []byte containing your secret, e.g. []byte("my_secret_key")
return []byte(SIGN_NAME_SCERET), nil
}) var claims jwt.MapClaims
var ok bool if claims, ok = token.Claims.(jwt.MapClaims); ok && token.Valid {
fmt.Println(claims["foo"], claims["nbf"])
} else {
fmt.Println(err)
} return claims
}

说明:dgrijalva/jwt-go 包中提供了简单的方法去签发和验证token。在进行过期时间检查时,使用的是iat 和exp 两个key进行,并未提供专门的设置过期时间的方法。

2. golang中解析java创建的token字符串

在golang中解析java创建的token,需要注意token的签名加密字符串。在java中,使用了方法TextCodec.BASE64.decode(base64EncodedSecretKey)。所以在token中,也要进行相应的转换,将key的转化格式改成mySignKeyBytes, err := base64.URLEncoding.DecodeString(“abcdksdjkf123”)。

示例代码

a. java创建token代码

public static void main(String[] args) {
String tokenSecretKey="abcdksdjkf123"; //密钥
Map<String, Object> claims = new HashMap<String, Object>();
claims.put("iss", "doubles"); String token = Jwts.builder()
.setHeaderParam("typ", "JWT") //设置头参数
.setClaims(claims) //设置内容对象
.signWith(SignatureAlgorithm.HS256, tokenSecretKey) //设置加密方式和传入密钥
.compact(); //生成token
System.out.println(token);
}

b. golang解析java token代码

func ParseAuthToken()  {
mySignKey := "abcdksdjkf123" //密钥,同java代码
mySignKeyBytes, err := base64.URLEncoding.DecodeString(mySignKey) //需要用和加密时同样的方式转化成对应的字节数组
if err != nil {
fmt.Println("base64 decodeString failed.", err)
return
}
token="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NDQ3NDk0NDIsImZvbyI6ImJhciIsImlhdCI6MTU0NDc1MzA0Mn0.t1NwZOUJP4Vj3L4YAiHletRNlc8vEtOMrjRAiyKl8aA"
parseAuth, err := jwt.Parse(token, func(*jwt.Token) (interface{}, error) {
return mySignKeyBytes, nil
})
if err != nil {
fmt.Println("parase with claims failed.", err)
return
}
fmt.Println( parseAuth.Claims)
}

golang中jwt使用的更多相关文章

  1. Go实战--golang中使用JWT(JSON Web Token)

    http://blog.csdn.net/wangshubo1989/article/details/74529333 之前写过关于golang中如何使用cookie的博客: 实战–go中使用cook ...

  2. golang中的选项模式

    索引 https://waterflow.link/articles/1663835071801 当我在使用go-zero时,我看到了好多像下面这样的代码: ... type ( // RunOpti ...

  3. golang中的race检测

    golang中的race检测 由于golang中的go是非常方便的,加上函数又非常容易隐藏go. 所以很多时候,当我们写出一个程序的时候,我们并不知道这个程序在并发情况下会不会出现什么问题. 所以在本 ...

  4. 基础知识 - Golang 中的正则表达式

    ------------------------------------------------------------ Golang中的正则表达式 ------------------------- ...

  5. golang中的reflect包用法

    最近在写一个自动生成api文档的功能,用到了reflect包来给结构体赋值,给空数组新增一个元素,这样只要定义一个input结构体和一个output的结构体,并填写一些相关tag信息,就能使用程序来生 ...

  6. Golang中的坑二

    Golang中的坑二 for ...range 最近两周用Golang做项目,编写web服务,两周时间写了大概五千行代码(业务代码加单元测试用例代码).用Go的感觉很爽,编码效率高,运行效率也不错,用 ...

  7. Golang 中的坑 一

    Golang 中的坑 短变量声明  Short variable declarations 考虑如下代码: package main import ( "errors" " ...

  8. google的grpc在golang中的使用

    GRPC是google开源的一个高性能.跨语言的RPC框架,基于HTTP2协议,基于protobuf 3.x,基于Netty 4.x. 前面写过一篇golang标准库的rpc包的用法,这篇文章接着讲一 ...

  9. Golang中Struct与DB中表字段通过反射自动映射 - sqlmapper

    Golang中操作数据库已经有现成的库"database/sql"可以用,但是"database/sql"只提供了最基础的操作接口: 对数据库中一张表的增删改查 ...

随机推荐

  1. 【JAVA编码专题】UNICODE,GBK,UTF-8区别 分类: B1_JAVA 2015-02-10 21:07 153人阅读 评论(0) 收藏

    简单来说,unicode,gbk和大五码就是编码的值,而utf-8,uft-16之类就是这个值的表现形式.而前面那三种编码是一兼容的,同一个汉字,那三个码值是完全不一样的.如"汉"的uncode值与g ...

  2. js进阶ajax的XMLHttpRequest对象的status和statustext属性(如果ajax和php联合使用的话:open连接服务器的第二个参数文件路径改成请求php的url即可)

    js进阶ajax的XMLHttpRequest对象的status和statustext属性(如果ajax和php联合使用的话:open连接服务器的第二个参数文件路径改成请求php的url即可) 一.总 ...

  3. ExtJS中store.findExact

    var ds = myGrid.apf_ds; var store = myGrid.getStore(); forEach(data, function (item) { if (store.fin ...

  4. php课程 4-14 数组如何定义使用

    php课程 4-14  数组如何定义使用 一.总结 1.各种语言键值对取值和赋值赋值表达式左边的特点是什么? 键值对,用于取值和赋值,取值和赋值的左边都是一样的 2.各种语言键值对取值或者赋值的时候如 ...

  5. BigDecimal 舍入模式(Rounding mode)介绍

    BigDecimal 舍入模式(Rounding mode)介绍 什么样的经历,才能领悟成为架构师? >>>   1 RoundingMode介绍 package java.math ...

  6. TensorFlow 辨异 —— tf.add(a, b) 与 a+b(tf.assign 与 =)、tf.nn.bias_add 与 tf.add

    1. tf.add(a, b) 与 a+b 在神经网络前向传播的过程中,经常可见如下两种形式的代码: tf.add(tf.matmul(x, w), b) tf.matmul(x, w) + b 简而 ...

  7. NOIP模拟 MST - 类次小生成树

    题目大意: 给一张无向图,可以将图中权值为v的边修改为k-v,求修改后的最小生成树边权和. 题目分析: 最小生成树的环切定理:任何非树边一定比对应树链上的所有边权值要大.否则我们可以将链上最大的树边删 ...

  8. Eclipse Che开发Spring Web应用(入门) (二)

    在上篇博客中我们介绍了如何安装Eclipse Che这种浏览器SDK之后,收到了许多开发者的提问,为了方便初学者开发Java web应用,笔者又一步步实践了spring web开发(demo)过程,欢 ...

  9. Android - HelloWorld的Layout内容

    Android - HelloWorld的Layout内容 本文地址: http://blog.csdn.net/caroline_wendy 作为最基础的Android程序, HelloWorld的 ...

  10. ANDROID L——RecyclerView,CardView进口和使用(Demo)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 简单介绍: 这篇文章是ANDROID L--Material Design具体解释(UI控 ...