我構建了一個簡單的程式來生成 Json Web Token (JWT),一切正常,直到我進行了令牌驗證以驗證 JWT,問題出現在我解碼 base64 字串以檢查標頭令牌之后。二進制檔案的某些部分消失了,而字串值來自編碼的 base64。這是我的代碼和結果
package auth
import "encoding/base64"
import "crypto/sha256"
import "encoding/json"
import "strings"
import "crypto/hmac"
import "encoding/hex"
import "fmt"
type Header struct{
Alg string
Typ string
}
type Payload struct{
id int
name string
userType bool
keepLogin bool
}
var key string = "12345678" //temporary
var payloadJson Payload
func GenerateToken(alg string, typ string, payload []byte)(string, error){
var headerEncoded, payloadEncoded, signature, mergedEncoded string
header := Header{Alg: alg,Typ: typ}
hmacDeclare := hmac.New(sha256.New, []byte(key))
headerJson, errHeader := json.Marshal(header)//struct -> byte
if errHeader != nil{
return "",errHeader
}
headerEncoded = encodeBase64(headerJson)//byte -> string
payloadEncoded = encodeBase64(payload)//byte -> string
mergedEncoded = headerEncoded "." payloadEncoded
if alg=="SHA256"{
hmacDeclare.Write([]byte(mergedEncoded))
signature = hex.EncodeToString(hmacDeclare.Sum(nil))
}
finalToken := headerEncoded "." payloadEncoded "." signature
//JUST SAMPLE TO TEST JWT RESULT
fmt.Println("Before encode (byte) => ", headerJson)
fmt.Println("Before encode (string) => ", string(headerJson))
fmt.Println("After encode (base64/string) => ", headerEncoded)
checkDecode,_ := decodeBase64(headerEncoded)//string -> byte
fmt.Println("After decode (byte) => ", checkDecode)
fmt.Println("After decode (string) => ", string(checkDecode))
// _, _ = VerifyToken(finalToken)
return finalToken, nil
}
func encodeBase64(data []byte) string {
formatString := strings.TrimRight(base64.StdEncoding.EncodeToString(data),"=")
return formatString
}
func decodeBase64(data string)([]byte, error){
result, err := base64.StdEncoding.DecodeString(data)
if err != nil{
return result, err
}
return result, nil
}
結果在這里
Before encode (byte) => [123 34 65 108 103 34 58 34 83 72 65 50 53 54 34 44 34 84 121 112 34 58 34 74 87 84 34 125]
Before encode (string) => {"Alg":"SHA256","Typ":"JWT"}
After encode (base64/string) => eyJBbGciOiJTSEEyNTYiLCJUeXAiOiJKV1QifQ
After decode (byte) => [123 34 65 108 103 34 58 34 83 72 65 50 53 54 34 44 34 84 121 112 34 58 34 74 87 84 34]
After decode (string) => {"Alg":"SHA256","Typ":"JWT"

有沒有人有同樣的問題?我試過瀏覽它,但沒有發現同樣的問題
uj5u.com熱心網友回復:
如果您不想要填充,請不要修剪它,而是使用WithPadding并傳入NoPadding.
func encodeBase64(data []byte) string {
e := base64.StdEncoding.WithPadding(base64.NoPadding)
return e.EncodeToString(data)
}
func decodeBase64(data string) ([]byte, error) {
e := base64.StdEncoding.WithPadding(base64.NoPadding)
result, err := e.DecodeString(data)
if err != nil {
return result, err
}
return result, nil
}
https://go.dev/play/p/bs6Wte-wHeD
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/404468.html
標籤:
