我在这里遵循了这个示例https://docs.payara.fish/community/docs/5.183/documentation/payara-server/public-api/openid-connect-support.html向我的应用程序添加身份验证和授权。但是,当我尝试使用授权标头中的 JWT 令牌(授权:Bearer ey...)调用应用程序时,它会失败并将我重定向回身份验证。
我的代码中有这个:
@ApplicationPath("/")
@OpenIdAuthenticationDefinition(
providerURI = "https://my-idp.com/auth",
clientId = "my-app-id",
clientSecret = "my-app-secret",
redirectURI = "http://localhost:8080/myapp/oauth2/callback",
scope = "openid"
)
@DeclareRoles({"my_role"})
public class MyApp extends Application {
}
那么对于我的资源,我有:
@Path("/my")
@RequestScoped
public class TestResource {
@Context
SecurityContext securityContext;
@GET
@Path("resource")
@Produces(MediaType.TEXT_PLAIN)
@RolesAllowed("my_role")
public String getName() {
return securityContext.getUserPrincipal().getName();
}
}
这是否意味着Payara micro上不提供此功能? 如果是这样,那么为什么授权部分会起作用?
这是我最终为我的问题所做的解决方案。我必须实现这些接口作为解决方案:
自定义http认证机制:
@Default
@ApplicationScoped
@Path("oauth2")
public class CustomHttpAuthenticationMechanism implements javax.security.enterprise.authentication.mechanism.http.HttpAuthenticationMechanism { ... }
自定义身份存储:
@javax.enterprise.context.ApplicationScoped
public class CustomIdentityStore implements javax.security.enterprise.identitystore.IdentityStore { ... }
自定义凭证:
class CustomTokenCredential implements javax.security.enterprise.credential.Credential { ... }
自定义主体:
public class CustomPrincipal extends javax.security.enterprise.CallerPrincipal implements javax.security.enterprise.credential.Credential { ... }