gluu
公開メンバ関数 | 静的公開メンバ関数 | 非公開変数類 | 静的非公開変数類 | 全メンバ一覧
org.xdi.oxd.server.op.Validator クラス
org.xdi.oxd.server.op.Validator 連携図
Collaboration graph

公開メンバ関数

 Validator (Jwt idToken, OpenIdConfigurationResponse discoveryResponse, PublicOpKeyService keyService)
 
void validateAccessToken (String accessToken)
 
void validateAuthorizationCode (String code)
 
void validateNonce (StateService stateService)
 
boolean isIdTokenValid (String clientId)
 
void validateIdToken (String clientId)
 
void validateIdToken (String nonce, String clientId)
 
Jwt getIdToken ()
 

静的公開メンバ関数

static RSASigner createRSASigner (Jwt jwt, OpenIdConfigurationResponse discoveryResponse, PublicOpKeyService keyService)
 

非公開変数類

final Jwt idToken
 
final OpenIdConfigurationResponse discoveryResponse
 
final PublicOpKeyService keyService
 
RSASigner rsaSigner
 

静的非公開変数類

static final Logger LOG = LoggerFactory.getLogger(Validator.class)
 

詳解

著者
Yuriy Zabrovarnyy
バージョン
0.9, 14/03/2017

構築子と解体子

◆ Validator()

org.xdi.oxd.server.op.Validator.Validator ( Jwt  idToken,
OpenIdConfigurationResponse  discoveryResponse,
PublicOpKeyService  keyService 
)
inline
36  {
37  Preconditions.checkNotNull(idToken);
38  Preconditions.checkNotNull(discoveryResponse);
39 
40  this.idToken = idToken;
42  this.keyService = keyService;
44  }
RSASigner rsaSigner
Definition: Validator.java:34
final OpenIdConfigurationResponse discoveryResponse
Definition: Validator.java:32
final Jwt idToken
Definition: Validator.java:31
final PublicOpKeyService keyService
Definition: Validator.java:33
static RSASigner createRSASigner(Jwt jwt, OpenIdConfigurationResponse discoveryResponse, PublicOpKeyService keyService)
Definition: Validator.java:62

関数詳解

◆ createRSASigner()

static RSASigner org.xdi.oxd.server.op.Validator.createRSASigner ( Jwt  jwt,
OpenIdConfigurationResponse  discoveryResponse,
PublicOpKeyService  keyService 
)
inlinestatic
62  {
63  final String jwkUrl = discoveryResponse.getJwksUri();
64  final String kid = jwt.getHeader().getClaimAsString(JwtHeaderName.KEY_ID);
65  final String algorithm = jwt.getHeader().getClaimAsString(JwtHeaderName.ALGORITHM);
66  final SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.fromString(algorithm);
67 
68  final RSAPublicKey publicKey = keyService.getRSAPublicKey(jwkUrl, kid);
69  return new RSASigner(signatureAlgorithm, publicKey);
70  }
String getJwksUri()
Definition: OpenIdConfigurationResponse.java:289
final OpenIdConfigurationResponse discoveryResponse
Definition: Validator.java:32
final PublicOpKeyService keyService
Definition: Validator.java:33
RSAPublicKey getRSAPublicKey(String jwkSetUri, String keyId)
Definition: PublicOpKeyService.java:36

◆ getIdToken()

Jwt org.xdi.oxd.server.op.Validator.getIdToken ( )
inline
157  {
158  return idToken;
159  }
final Jwt idToken
Definition: Validator.java:31

◆ isIdTokenValid()

boolean org.xdi.oxd.server.op.Validator.isIdTokenValid ( String  clientId)
inline
79  {
80  try {
81  validateIdToken(clientId);
82  return true;
83  } catch (Exception e) {
84  return false;
85  }
86  }
void validateIdToken(String clientId)
Definition: Validator.java:88

◆ validateAccessToken()

void org.xdi.oxd.server.op.Validator.validateAccessToken ( String  accessToken)
inline
46  {
47  if (!Strings.isNullOrEmpty(accessToken)) {
48  if (!rsaSigner.validateAccessToken(accessToken, idToken)) {
49  throw new ErrorResponseException(ErrorResponseCode.INVALID_ACCESS_TOKEN_BAD_HASH);
50  }
51  }
52  }
RSASigner rsaSigner
Definition: Validator.java:34
boolean validateAccessToken(String accessToken, Jwt idToken)
Definition: AbstractJwsSigner.java:71
final Jwt idToken
Definition: Validator.java:31

◆ validateAuthorizationCode()

void org.xdi.oxd.server.op.Validator.validateAuthorizationCode ( String  code)
inline
54  {
55  if (!Strings.isNullOrEmpty(code)) {
57  throw new ErrorResponseException(ErrorResponseCode.INVALID_AUTHORIZATION_CODE_BAD_HASH);
58  }
59  }
60  }
boolean validateAuthorizationCode(String authorizationCode, Jwt idToken)
Definition: AbstractJwsSigner.java:67
RSASigner rsaSigner
Definition: Validator.java:34
final Jwt idToken
Definition: Validator.java:31

◆ validateIdToken() [1/2]

void org.xdi.oxd.server.op.Validator.validateIdToken ( String  clientId)
inline
88  {
89  validateIdToken(null, clientId);
90  }
void validateIdToken(String clientId)
Definition: Validator.java:88

◆ validateIdToken() [2/2]

void org.xdi.oxd.server.op.Validator.validateIdToken ( String  nonce,
String  clientId 
)
inline
92  {
93  try {
94  final String issuer = idToken.getClaims().getClaimAsString(JwtClaimName.ISSUER);
95  final String nonceFromToken = idToken.getClaims().getClaimAsString(JwtClaimName.NONCE);
96  final String audienceFromToken = idToken.getClaims().getClaimAsString(JwtClaimName.AUDIENCE);
97 
98  if (!Strings.isNullOrEmpty(nonce) && !nonceFromToken.endsWith(nonce)) {
99  LOG.error("ID Token has invalid nonce. Expected nonce: " + nonce + ", nonce from token is: " + nonceFromToken);
100  throw new ErrorResponseException(ErrorResponseCode.INVALID_ID_TOKEN_BAD_NONCE);
101  }
102 
103  if (!clientId.equalsIgnoreCase(audienceFromToken)) {
104  List<String> audAsList = idToken.getClaims().getClaimAsStringList(JwtClaimName.AUDIENCE);
105  if (audAsList != null && audAsList.size() == 1) {
106  if (!clientId.equalsIgnoreCase(audAsList.get(0))) {
107  LOG.error("ID Token has invalid audience (string list). Expected audience: " + clientId + ", audience from token is: " + audAsList);
108  throw new ErrorResponseException(ErrorResponseCode.INVALID_ID_TOKEN_BAD_AUDIENCE);
109  }
110  }
111 
112  // somehow fetching string list does not return actual list, so we do this ugly trick to compare single valued array, more details in #178
113  boolean equalsWithSingleValuedArray = ("[\"" + clientId + "\"]").equalsIgnoreCase(audienceFromToken);
114  if (!equalsWithSingleValuedArray) {
115  LOG.error("ID Token has invalid audience (single valued array). Expected audience: " + clientId + ", audience from token is: " + audienceFromToken);
116  throw new ErrorResponseException(ErrorResponseCode.INVALID_ID_TOKEN_BAD_AUDIENCE);
117  }
118  }
119 
120  final Date expiresAt = idToken.getClaims().getClaimAsDate(JwtClaimName.EXPIRATION_TIME);
121  final Date now = new Date();
122  if (now.after(expiresAt)) {
123  LOG.error("ID Token is expired. (It is after " + now + ").");
124  throw new ErrorResponseException(ErrorResponseCode.INVALID_ID_TOKEN_EXPIRED);
125  }
126 
127  // 1. validate issuer
128  if (!issuer.equals(discoveryResponse.getIssuer())) {
129  LOG.error("ID Token issuer is invalid. Token issuer: " + issuer + ", discovery issuer: " + discoveryResponse.getIssuer());
130  throw new ErrorResponseException(ErrorResponseCode.INVALID_ID_TOKEN_BAD_ISSUER);
131  }
132 
133  // 2. validate signature
134  boolean signature = rsaSigner.validate(idToken);
135  if (!signature) {
136  final String jwkUrl = discoveryResponse.getJwksUri();
137  final String kid = idToken.getHeader().getClaimAsString(JwtHeaderName.KEY_ID);
138 
139  keyService.refetchKey(jwkUrl, kid);
140 
141  RSASigner signerWithRefreshedKey = createRSASigner(idToken, discoveryResponse, keyService);
142  signature = signerWithRefreshedKey.validate(idToken);
143 
144  if (!signature) {
145  LOG.error("ID Token signature is invalid.");
146  throw new ErrorResponseException(ErrorResponseCode.INVALID_ID_TOKEN_BAD_SIGNATURE);
147  } else {
148  this.rsaSigner = signerWithRefreshedKey;
149  }
150  }
151  } catch (Exception e) {
152  LOG.error(e.getMessage(), e);
153  throw new ErrorResponseException(ErrorResponseCode.INVALID_ID_TOKEN_UNKNOWN);
154  }
155  }
String getClaimAsString(String key)
Definition: JwtClaimSet.java:55
static final Logger LOG
Definition: Validator.java:29
RSASigner rsaSigner
Definition: Validator.java:34
JwtClaims getClaims()
Definition: JsonWebResponse.java:41
List< String > getClaimAsStringList(String key)
Definition: JwtClaimSet.java:81
RSAPublicKey refetchKey(String jwkUrl, String kid)
Definition: PublicOpKeyService.java:66
String getJwksUri()
Definition: OpenIdConfigurationResponse.java:289
Date getClaimAsDate(String key)
Definition: JwtClaimSet.java:103
final OpenIdConfigurationResponse discoveryResponse
Definition: Validator.java:32
final Jwt idToken
Definition: Validator.java:31
final PublicOpKeyService keyService
Definition: Validator.java:33
boolean validate(Jwt jwt)
Definition: AbstractJwsSigner.java:49
JwtHeader getHeader()
Definition: JsonWebResponse.java:33
static RSASigner createRSASigner(Jwt jwt, OpenIdConfigurationResponse discoveryResponse, PublicOpKeyService keyService)
Definition: Validator.java:62
String getIssuer()
Definition: OpenIdConfigurationResponse.java:156

◆ validateNonce()

void org.xdi.oxd.server.op.Validator.validateNonce ( StateService  stateService)
inline
72  {
73  final String nonceFromToken = idToken.getClaims().getClaimAsString(JwtClaimName.NONCE);
74  if (!stateService.isNonceValid(nonceFromToken)) {
75  throw new ErrorResponseException(ErrorResponseCode.INVALID_NONCE);
76  }
77  }
String getClaimAsString(String key)
Definition: JwtClaimSet.java:55
JwtClaims getClaims()
Definition: JsonWebResponse.java:41
final Jwt idToken
Definition: Validator.java:31

メンバ詳解

◆ discoveryResponse

final OpenIdConfigurationResponse org.xdi.oxd.server.op.Validator.discoveryResponse
private

◆ idToken

final Jwt org.xdi.oxd.server.op.Validator.idToken
private

◆ keyService

final PublicOpKeyService org.xdi.oxd.server.op.Validator.keyService
private

◆ LOG

final Logger org.xdi.oxd.server.op.Validator.LOG = LoggerFactory.getLogger(Validator.class)
staticprivate

◆ rsaSigner

RSASigner org.xdi.oxd.server.op.Validator.rsaSigner
private

このクラス詳解は次のファイルから抽出されました: