基本的な生成と検証のみ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
package main import ( "errors" "log" jwt "github.com/dgrijalva/jwt-go" ) /* ・Jwt構成 Base64urlでエンコードされている。 "+" > "-" "/" > "_" "=" > "" Jwtは3パート、ヘッダー、ペイロード、署名がある。 ヘッダーはtypとalgで構成。 ペイロードはClaim(属性)で必須はないが予約パラメータはある。 署名はエンコ済みヘッダーとペイロードをピリオドでつないで、algのアルゴリズムで署名したもの。 ・Bearer認証(トークンを持ってきたら認証する方式) トークンをヘッダーに付与する場合、Authorizationヘッダーに付与する。 (カスタムヘッダー(x-付)にすることもできる) ヘッダー形式 Authorization: auth-scheme credential auth-schemeの1つとしてBearer Bearer認証のヘッダー形式 Authorization: Bearer token68 */ func main() { tokenString := createToken("123") log.Print(tokenString) //生成した文字列をそのままチェックしてみる。 log.Print(authToken(tokenString, "123")) //ok //生成した文字列を違うキーでチェックしてみる。 log.Print(authToken(tokenString, "234")) //signature is invalid } func createToken(key string) string { /* 生成方法いくつか token := jwt.New(jwt.SigningMethodHS256) c := token.Claims.(jwt.MapClaims) c["user"] = "taro" -------------------------------------------------------- c := jwt.StandardClaims{ Audience: "taro", } token := jwt.NewWithClaims(jwt.SigningMethodHS256, c) -------------------------------------------------------- type User struct { Name string jwt.StandardClaims } token := jwt.NewWithClaims(jwt.GetSigningMethod("HS256"), &User{ Name: "taro", }) */ //電子署名 token := jwt.New(jwt.SigningMethodHS256) //属性情報 c := token.Claims.(jwt.MapClaims) c["user"] = "taro" /* 標準Claimが準備されている */ //keyで文字列化 tokenString, _ := token.SignedString([]byte(key)) return tokenString } func authToken(tokenString string, key string) string { //keyでtoken化 token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { //このようなアルゴリズムチェックを入れている記事が多い。 //HMAC(共通),ECDSA,RSA(公開) if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, errors.New("alg error") } //keyを返す return []byte(key), nil }) if err != nil { log.Print(err) return "" } if !token.Valid { return "valid error" } return "ok" } |