• Token used before issued はjwtのParseの時iatが現在時刻より未来の場合発生する
  • サーバー間の時刻のずれでも発生するので注意する
  • Parseはerrorがnilでない時もtokenを返すので、後処理はできる
package main

import (
	"fmt"

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

func main() {

	// iatが2030年になっている
	tokenstring := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxOTE2MjM5MDIyfQ.jHQiBm09vEVjEx9347u2hU7LTreUVtEbWRPWrr9DG_A"

	secret := "my_secret_token"

	token, err := tokenParse(tokenstring, []byte(secret))

	if err != nil {
		fmt.Printf("Error:%v\n", err)
		return
	}

	claims, ok := token.Claims.(jwt.MapClaims)
	if ok {
		fmt.Println(claims)
		fmt.Println(claims["name"])
		return
	}
}

func tokenParse(idToken string, hmacSecret []byte) (*jwt.Token, error) {
	token, err := jwt.Parse(idToken, func(token *jwt.Token) (interface{}, error) {
		// アルゴリズムの判定
		if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
			return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
		}
		return hmacSecret, nil
	})
	return token, err
}