github.com/goplus/yap@v0.8.1/ytest/auth/jwt/jwt.go (about) 1 /* 2 * Copyright (c) 2024 The GoPlus Authors (goplus.org). All rights reserved. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package jwt 18 19 import ( 20 "log" 21 "net/http" 22 "time" 23 24 "github.com/golang-jwt/jwt/v5" 25 "github.com/goplus/yap/ytest/auth" 26 ) 27 28 // ----------------------------------------------------------------------------- 29 30 type Signaturer struct { 31 method jwt.SigningMethod 32 claims jwt.MapClaims 33 secret any 34 } 35 36 func (p *Signaturer) Set(k string, v any) *Signaturer { 37 p.claims[k] = v 38 return p 39 } 40 41 func (p *Signaturer) Audience(aud ...string) *Signaturer { 42 p.claims["aud"] = jwt.ClaimStrings(aud) 43 return p 44 } 45 46 func (p *Signaturer) Expiration(exp time.Time) *Signaturer { 47 p.claims["exp"] = jwt.NewNumericDate(exp) 48 return p 49 } 50 51 func (p *Signaturer) NotBefore(nbf time.Time) *Signaturer { 52 p.claims["nbf"] = jwt.NewNumericDate(nbf) 53 return p 54 } 55 56 func (p *Signaturer) IssuedAt(iat time.Time) *Signaturer { 57 p.claims["iat"] = jwt.NewNumericDate(iat) 58 return p 59 } 60 61 func (p *Signaturer) Compose(rt http.RoundTripper) http.RoundTripper { 62 token := jwt.NewWithClaims(p.method, p.claims) 63 raw, err := token.SignedString(p.secret) 64 if err != nil { 65 log.Panicln("jwt token.SignedString:", err) 66 } 67 return auth.WithToken(rt, "Bearer "+raw) 68 } 69 70 func newSign(method jwt.SigningMethod, secret any) *Signaturer { 71 return &Signaturer{ 72 method: method, 73 claims: make(jwt.MapClaims), 74 secret: secret, 75 } 76 } 77 78 // HS256 creates a signing methods by using the HMAC-SHA256. 79 func HS256(key string) *Signaturer { 80 return newSign(jwt.SigningMethodHS256, []byte(key)) 81 } 82 83 // HS384 creates a signing methods by using the HMAC-SHA384. 84 func HS384(key string) *Signaturer { 85 return newSign(jwt.SigningMethodHS384, []byte(key)) 86 } 87 88 // HS512 creates a signing methods by using the HMAC-SHA512. 89 func HS512(key string) *Signaturer { 90 return newSign(jwt.SigningMethodHS512, []byte(key)) 91 } 92 93 // -----------------------------------------------------------------------------