forked from alterminal/alterminal
fixup
This commit is contained in:
+17
-7
@@ -159,12 +159,12 @@ func scopeHas(scope, s string) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
// VerifyAccessToken 驗證 Access Token 並回傳其 claims:拆解三段 JWT、
|
||||
// 拒絕非 RS256 的 alg(RFC 8725 §3.4 的演算法混淆防護)、以 header kid
|
||||
// 對應的簽章金鑰驗章(金鑰輪替過渡期仍可查得已退休金鑰)、比對 issuer
|
||||
// 與效期(OIDC Core §3.1.3.7 的 iss/exp 驗證項)。任何一項不符即回
|
||||
// ErrInvalidToken,不洩漏細節。
|
||||
func VerifyAccessToken(db *gorm.DB, issuer, token string) (*AccessTokenClaims, error) {
|
||||
// verifyJWTSignature 驗證 JWT 的外層結構與簽章:拆解三段、僅接受 RS256
|
||||
// 的 alg(RFC 8725 §3.4 的演算法混淆防護)、以 header kid 對應的簽章
|
||||
// 金鑰驗章(金鑰輪替過渡期仍可查得已退休金鑰),回傳解碼後的 claims
|
||||
// JSON,供 VerifyAccessToken 與 verifyIDTokenHint 共用。任何一項不符即回
|
||||
// 包裹 ErrInvalidToken 的錯誤,不洩漏細節。
|
||||
func verifyJWTSignature(db *gorm.DB, token string) ([]byte, error) {
|
||||
parts := strings.Split(token, ".")
|
||||
if len(parts) != 3 {
|
||||
return nil, fmt.Errorf("%w:%s", ErrInvalidToken, "結構")
|
||||
@@ -197,11 +197,21 @@ func VerifyAccessToken(db *gorm.DB, issuer, token string) (*AccessTokenClaims, e
|
||||
if err := rsa.VerifyPKCS1v15(&priv.PublicKey, crypto.SHA256, digest[:], sig); err != nil {
|
||||
return nil, fmt.Errorf("%w:%s", ErrInvalidToken, "signature")
|
||||
}
|
||||
|
||||
payloadJSON, err := base64.RawURLEncoding.DecodeString(parts[1])
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("%w:%s", ErrInvalidToken, "claims")
|
||||
}
|
||||
return payloadJSON, nil
|
||||
}
|
||||
|
||||
// VerifyAccessToken 驗證 Access Token 並回傳其 claims:驗章同
|
||||
// verifyJWTSignature,另比對 issuer 與效期(OIDC Core §3.1.3.7 的 iss/
|
||||
// exp 驗證項)。任何一項不符即回 ErrInvalidToken,不洩漏細節。
|
||||
func VerifyAccessToken(db *gorm.DB, issuer, token string) (*AccessTokenClaims, error) {
|
||||
payloadJSON, err := verifyJWTSignature(db, token)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var claims AccessTokenClaims
|
||||
if err := json.Unmarshal(payloadJSON, &claims); err != nil {
|
||||
return nil, fmt.Errorf("%w:%s", ErrInvalidToken, "claims")
|
||||
|
||||
Reference in New Issue
Block a user