1.2. sender-constraining 访问令牌
1.2.1. 演示 Possession 的证明证明(DPoP) 复制链接链接已复制到粘贴板!
RFC9449 描述了一种将访问令牌绑定到当前客户端的轮询证明(DPoP)机制,防止访问令牌丢失和重播。
单个页面应用程序(SPA)公共客户端生成 DPoP 证明令牌,并使用它们获取和提交访问令牌,这些访问令牌以加密方式绑定到 DPoP 证明。
在 Quarkus 中启用 DPoP 支持需要一个属性。
例如:
quarkus.oidc.auth-server-url=${your_oidc_provider_url}
quarkus.oidc.token.authorization-scheme=dpop
- 1
- 要求访问令牌使用 HTTP
授权 DPoP方案值来提供。
接受此类令牌后,Quarkus 将经过完整的 DPoP 令牌验证过程。
以后可能会提供对自定义 DPoP 非供应商的支持。
1.2.2. 双向 TLS 令牌绑定 复制链接链接已复制到粘贴板!
RFC8705 描述了将访问令牌绑定到 Mutual TLS (mTLS)客户端身份验证证书的机制。它要求客户端证书的 SHA256 thumbprint 与 JWT 令牌或令牌内省确认 x5t#S256 证书 thumbprint 匹配。
例如,请参阅 RFC8705 的 Token Introspection 部分的 JWT 证书 Thumbprint 确认方法和确认方法。
MTLS 令牌绑定支持 密钥概念的所有者,可用于确认当前访问令牌已发布到提供此令牌的当前验证客户端。
当使用 mTLS 和 OIDC bearer 验证机制时,您可以在将 Quarkus 端点和 Quarkus OIDC 配置为需要使用 mTLS 后,强制访问令牌必须是与单个属性绑定的证书。
例如:
quarkus.oidc.auth-server-url=${your_oidc_provider_url}
quarkus.oidc.token.binding.certificate=true
quarkus.oidc.tls.tls-configuration-name=oidc-client-tls
quarkus.tls.oidc-client-tls.key-store.p12.path=target/certificates/oidc-client-keystore.p12
quarkus.tls.oidc-client-tls.key-store.p12.password=password
quarkus.tls.oidc-client-tls.trust-store.p12.path=target/certificates/oidc-client-truststore.p12
quarkus.tls.oidc-client-tls.trust-store.p12.password=password
quarkus.http.tls-configuration-name=oidc-server-mtls
quarkus.tls.oidc-server-mtls.key-store.p12.path=target/certificates/oidc-keystore.p12
quarkus.tls.oidc-server-mtls.key-store.p12.password=password
quarkus.tls.oidc-server-mtls.trust-store.p12.path=target/certificates/oidc-server-truststore.p12
quarkus.tls.oidc-server-mtls.trust-store.p12.password=password
以上配置足以要求 OIDC bearer 令牌绑定到客户端证书。
接下来,如果您需要访问 mTLS 和 OIDC bearer 安全身份,请考虑使用 quarkus.http.auth.inclusive=true 启用 Inclusive 身份验证。
现在,您可以访问 MTLS 和 OIDC 安全身份,如下所示:
package io.quarkus.it.oidc;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import org.eclipse.microprofile.jwt.JsonWebToken;
import io.quarkus.security.Authenticated;
import io.quarkus.security.credential.CertificateCredential;
import io.quarkus.security.identity.SecurityIdentity;
@Path("/service")
@Authenticated
public class OidcMtlsEndpoint {
@Inject
SecurityIdentity mtlsIdentity;
@Inject
JsonWebToken oidcAccessToken;
@GET
public String getIdentities() {
var cred = identity.getCredential(CertificateCredential.class).getCertificate();
return "Identities: " + cred.getSubjectX500Principal().getName().split(",")[0]
+ ", " + accessToken.getName();
}
}