This commit is contained in:
2026-10-03 12:37:38 +08:00
parent bcf3d3769c
commit 5fc1755c17
22 changed files with 1845 additions and 100 deletions
+17 -7
View File
@@ -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")