in kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/preauth/token/TokenPreauth.java [64:125]
public boolean verify(KdcRequest kdcRequest, PluginRequestContext requestContext,
PaDataEntry paData) throws KrbException {
if (!kdcRequest.getKdcContext().getConfig().isAllowTokenPreauth()) {
throw new KrbException(KrbErrorCode.TOKEN_PREAUTH_NOT_ALLOWED,
"Token preauth is not allowed.");
}
if (paData.getPaDataType() == PaDataType.TOKEN_REQUEST) {
PaTokenRequest paTokenRequest;
if (kdcRequest.isHttps()) {
paTokenRequest = KrbCodec.decode(paData.getPaDataValue(),
PaTokenRequest.class);
} else {
EncryptedData encData = KrbCodec.decode(paData.getPaDataValue(), EncryptedData.class);
EncryptionKey clientKey = kdcRequest.getArmorKey();
kdcRequest.setClientKey(clientKey);
paTokenRequest = EncryptionUtil.unseal(encData, clientKey,
KeyUsage.PA_TOKEN, PaTokenRequest.class);
}
KrbTokenBase token = paTokenRequest.getToken();
List<String> issuers = kdcRequest.getKdcContext().getConfig().getIssuers();
TokenInfo tokenInfo = paTokenRequest.getTokenInfo();
String issuer = tokenInfo.getTokenVendor();
if (!issuers.contains(issuer)) {
throw new KrbException("Unconfigured issuer: " + issuer);
}
// Configure keys
TokenDecoder tokenDecoder = KrbRuntime.getTokenProvider("JWT").createTokenDecoder();
configureKeys(tokenDecoder, kdcRequest, issuer);
AuthToken authToken;
try {
authToken = tokenDecoder.decodeFromBytes(token.getTokenValue());
if (!tokenDecoder.isSigned()) {
throw new KrbException("Token should be signed.");
}
} catch (IOException e) {
throw new KrbException("Decoding failed", e);
}
if (authToken == null) {
throw new KrbException("Token Decoding failed");
}
List<String> audiences = authToken.getAudiences();
PrincipalName serverPrincipal = kdcRequest.getKdcReq().getReqBody().getSname();
serverPrincipal.setRealm(kdcRequest.getKdcReq().getReqBody().getRealm());
kdcRequest.setServerPrincipal(serverPrincipal);
if (audiences == null || !audiences.contains(serverPrincipal.getName())) {
throw new KrbException(
"The token audience does not match with the target server principal! "
+ "Server principal is: " + serverPrincipal);
}
kdcRequest.setToken(authToken);
return true;
} else {
return false;
}
}