golang 实现 json web token

前端之家收集整理的这篇文章主要介绍了golang 实现 json web token前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

json web token 简介@H_301_2@
  1. json web token 简称 jwt.他是一种轻量级的规范.这种规范允许客户端和服务端之间传递一些非敏感信息.
  2. 常用于用户认证和授权系统.

jwt组成部分@H_301_2@
  1. Header
  2. Claims
  3. Signature

Header 组成部分
typ: "JWT",alg: "HS256",

1. typ是默认的一种标识.标识这条信息采用JWT规范.
2. alg表示签名使用的加密算法.通常有ES256,ES512,RS256等等

Claims 组成部分@H_301_2@
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"`

这段结构体是我们在golang中使用到的字段. 可以在这个的基础上进行组合,定义新的Claims部分.

1. aud 标识token的接收者.
2. exp 过期时间.通常与Unix UTC时间做对比过期后token无效
3. jti 是自定义的id号 
4. iat 签名发行时间.
5. iss 是签名的发行者.
6. nbf 这条token信息生效时间.这个值可以不设置,但是设定后,一定要大于当前Unix UTC,否则token将会延迟生效.
7. sub 签名面向的用户

通过设置exp与nbf来管理token的生命周期.

Signature 组成部分@H_301_2@
  1. 将Header与Claims信息拼接起来[base64(header)+”.”+base64(claims)],采用Header中指定的加密算法进行加密,得到Signature部分.

token组成部分

  1. base64(header) + “.” + base64(claims) + “.” + 加密签名
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjI5NTg5MTA4MDYsImlzcyI6InRlc3QiLCJuYmYiOjE0Nzk0NTczMTZ9.57gqtlk1nNezXSa0VgWBOwu2b2FCDJ6wXizuJF6IY10

如上边的token,由2个点好分割.第一部分是iheader的base64编码,第二部分是claims的base64编码,第三部分是加密签名信息.

下边来简单的介绍下golang中使用操作token的简单过程.在使用这个示例前,请获取如下包:

go get github.com/dgrijalva/jwt-go

package main

import (
    "fmt"
    "time"

    jwt "github.com/dgrijalva/jwt-go"
)

func main() {
    mySigningKey := []byte("hzwy23")
    // Create the Claims
    claims := &jwt.StandardClaims{
        NotBefore: int64(time.Now().Unix() - 1000),ExpiresAt: int64(time.Now().Unix() + 1000),Issuer:    "test",}

    token := jwt.NewWithClaims(jwt.SigningMethodHS256,claims)
    ss,err := token.SignedString(mySigningKey)
    fmt.Println("签名后的token信息:",ss)
    t,err := jwt.Parse(ss,func(*jwt.Token) (interface{},error) {
        return mySigningKey,nil
    })

    if err != nil {
        fmt.Println("parase with claims Failed.",err)
        return
    }
    fmt.Println("还原后的token信息claims部分:",t.Claims)
}

输出结果

签名后的token信息: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0Nzk0NjAzMjMsImlzcyI6InRlc3QiLCJuYmYiOjE0Nzk0NTgzMjN9.7qMftDWhLHzYcheCEFOoLyH698HUNCm0Sq_SOOqAC90
还原后的token信息claims部分: map[iss:test nbf:1.479458323e+09 exp:1.479460323e+09]

注意事项@H_301_2@

如果token 信息parse后与签名信息不一致,则会爆出异常.

原文链接:https://www.f2er.com/go/189190.html

猜你在找的Go相关文章