golang中jwt使用
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使用的更多相关文章
- Go实战--golang中使用JWT(JSON Web Token)
http://blog.csdn.net/wangshubo1989/article/details/74529333 之前写过关于golang中如何使用cookie的博客: 实战–go中使用cook ...
- golang中的选项模式
索引 https://waterflow.link/articles/1663835071801 当我在使用go-zero时,我看到了好多像下面这样的代码: ... type ( // RunOpti ...
- golang中的race检测
golang中的race检测 由于golang中的go是非常方便的,加上函数又非常容易隐藏go. 所以很多时候,当我们写出一个程序的时候,我们并不知道这个程序在并发情况下会不会出现什么问题. 所以在本 ...
- 基础知识 - Golang 中的正则表达式
------------------------------------------------------------ Golang中的正则表达式 ------------------------- ...
- golang中的reflect包用法
最近在写一个自动生成api文档的功能,用到了reflect包来给结构体赋值,给空数组新增一个元素,这样只要定义一个input结构体和一个output的结构体,并填写一些相关tag信息,就能使用程序来生 ...
- Golang中的坑二
Golang中的坑二 for ...range 最近两周用Golang做项目,编写web服务,两周时间写了大概五千行代码(业务代码加单元测试用例代码).用Go的感觉很爽,编码效率高,运行效率也不错,用 ...
- Golang 中的坑 一
Golang 中的坑 短变量声明 Short variable declarations 考虑如下代码: package main import ( "errors" " ...
- google的grpc在golang中的使用
GRPC是google开源的一个高性能.跨语言的RPC框架,基于HTTP2协议,基于protobuf 3.x,基于Netty 4.x. 前面写过一篇golang标准库的rpc包的用法,这篇文章接着讲一 ...
- Golang中Struct与DB中表字段通过反射自动映射 - sqlmapper
Golang中操作数据库已经有现成的库"database/sql"可以用,但是"database/sql"只提供了最基础的操作接口: 对数据库中一张表的增删改查 ...
随机推荐
- [RxJS] Hot Observable, by .share()
.share() is an alias for .publish().refCount(). So if the source is not yet completed, no matter how ...
- stm32的DMA基础,配置流程解析
这是手册上的流程 下面是对应的库函数 下面我们就按流程去看相应的寄存器: 步骤1里的寄存器, 进入下面的函数内部: 可以找到对应的操作: 再看下一个重要的寄存器: 再看下一个寄存器: 还有一种模式是: ...
- HDU 5072 Coprime (单色三角形+容斥原理)
题目链接:Coprime pid=5072"> 题面: Coprime Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
- Yii学习笔记之四(表单验证 api 翻译)
1.表单验证 对于用户输入的全部数据,你不能信任,必须加以验证. 全部框架如此.对于yii 能够使用函数 yii\base\Model::validate() 进行验证 他会返回boolean值的 ...
- 【poj2528】Mayor's posters
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 59254 Accepted: 17167 Description The ...
- Windows7系统下安装OpenSSL攻略
Windows7系统下安装OpenSSL攻略 http://blog.chinaunix.net/uid-20479991-id-216269.html http://my.oschina.net/s ...
- MySQL 基础查询
6月业绩榜 名次 伙伴 业绩 签单 面谈 每日目标 1 杜艳花 12367 2 0 查看目标 2 郑东杰 2345 1 0 查看目标 3 黄传龙 345 1 1 查看目标 4 測试 0 0 0 查 ...
- C++ 快速入门笔记:进阶编程
C++入门笔记:高级编程 文件和流 打开文件 void open (const char *filename, ios::openmode mode); ios::app 追加模式.所有写入都追加到文 ...
- redis持久化,主从及数据备份
http://blog.csdn.net/lang_man_xing/article/details/38386113 现在在项目里已经大量使用redis了,为了提高redis的性能和可靠性我们需要知 ...
- hadoop实现购物商城推荐系统
1,商城:是单商家,多买家的商城系统.数据库是mysql,语言java. 2,sqoop1.9.33:在mysql和hadoop中交换数据. 3,hadoop2.2.0:这里用于练习的是伪分布模式. ...