From b1b6ebe69218d2e634fce091af044300de4eb6b4 Mon Sep 17 00:00:00 2001 From: Brian Yu Date: Mon, 10 Feb 2025 20:44:44 +0800 Subject: [PATCH] feat(jwt): add `azp` claim to ID token (#3570) Added the `azp` (Authorized Party) claim to various JWT token structures including Claims, ClaimsShort, ClaimsWithoutThirdIdp, and ClaimsStandard. Updated the generateJwtToken and getClaimsCustom functions to handle the new claim. This change aligns with the OpenID Connect specification. --- object/token_jwt.go | 8 ++++++++ object/token_standard_jwt.go | 2 ++ 2 files changed, 10 insertions(+) diff --git a/object/token_jwt.go b/object/token_jwt.go index 14ccde1d..1ee9e079 100644 --- a/object/token_jwt.go +++ b/object/token_jwt.go @@ -30,6 +30,8 @@ type Claims struct { Nonce string `json:"nonce,omitempty"` Tag string `json:"tag"` Scope string `json:"scope,omitempty"` + // the `azp` (Authorized Party) claim. Optional. See https://openid.net/specs/openid-connect-core-1_0.html#IDToken + Azp string `json:"azp,omitempty"` jwt.RegisteredClaims } @@ -137,6 +139,7 @@ type ClaimsShort struct { TokenType string `json:"tokenType,omitempty"` Nonce string `json:"nonce,omitempty"` Scope string `json:"scope,omitempty"` + Azp string `json:"azp,omitempty"` jwt.RegisteredClaims } @@ -155,6 +158,7 @@ type ClaimsWithoutThirdIdp struct { Nonce string `json:"nonce,omitempty"` Tag string `json:"tag"` Scope string `json:"scope,omitempty"` + Azp string `json:"azp,omitempty"` jwt.RegisteredClaims } @@ -269,6 +273,7 @@ func getShortClaims(claims Claims) ClaimsShort { Nonce: claims.Nonce, Scope: claims.Scope, RegisteredClaims: claims.RegisteredClaims, + Azp: claims.Azp, } return res } @@ -281,6 +286,7 @@ func getClaimsWithoutThirdIdp(claims Claims) ClaimsWithoutThirdIdp { Tag: claims.Tag, Scope: claims.Scope, RegisteredClaims: claims.RegisteredClaims, + Azp: claims.Azp, } return res } @@ -301,6 +307,7 @@ func getClaimsCustom(claims Claims, tokenField []string) jwt.MapClaims { res["nonce"] = claims.Nonce res["tag"] = claims.Tag res["scope"] = claims.Scope + res["azp"] = claims.Azp for _, field := range tokenField { userField := userValue.FieldByName(field) @@ -357,6 +364,7 @@ func generateJwtToken(application *Application, user *User, nonce string, scope // FIXME: A workaround for custom claim by reusing `tag` in user info Tag: user.Tag, Scope: scope, + Azp: application.ClientId, RegisteredClaims: jwt.RegisteredClaims{ Issuer: originBackend, Subject: user.Id, diff --git a/object/token_standard_jwt.go b/object/token_standard_jwt.go index f5fba8a6..7ef81739 100644 --- a/object/token_standard_jwt.go +++ b/object/token_standard_jwt.go @@ -32,6 +32,7 @@ type ClaimsStandard struct { Nonce string `json:"nonce,omitempty"` Scope string `json:"scope,omitempty"` Address OIDCAddress `json:"address,omitempty"` + Azp string `json:"azp,omitempty"` jwt.RegisteredClaims } @@ -52,6 +53,7 @@ func getStandardClaims(claims Claims) ClaimsStandard { Nonce: claims.Nonce, Scope: claims.Scope, RegisteredClaims: claims.RegisteredClaims, + Azp: claims.Azp, } res.Phone = ""