Quarkus + keycloak - HTTP/1.1 403 Запрещено

Я пробовал интеграцию безопасности Quarkus с keycloak

Вот мои конечные точки отдыха

@Path("/jwt")
@RequestScoped
public class JWTRestController {

    @Inject
    @Claim(standard = Claims.preferred_username)
    Optional<JsonString> currentUsername;

    @GET
    @Path("/user")
    @Produces(MediaType.TEXT_PLAIN)
    @RolesAllowed({"user"})
    public String userData() {
        return "data for user ";
    }

    @GET
    @Path("/admin")
    @Produces(MediaType.TEXT_PLAIN)
    @RolesAllowed({"admin"})
    public String adminData() {
        return "data for admin ";
    }

}

Мои свойства приложения

# Configuration file
quarkus.http.port=8082

# MP-JWT Config
mp.jwt.verify.publickey.location=http://localhost:8180/auth/realms/demo/protocol/openid-connect/certs
mp.jwt.verify.issuer=http://localhost:8180/auth/realms/demo
quarkus.smallrye-jwt.auth-mechanism=MP-JWT
quarkus.smallrye-jwt.realmName=quarkus-keycloak-demo
quarkus.smallrye-jwt.enabled=true

У меня запущен экземпляр keycloak на моей локальной машине разработки на порту 8180. Я выполнил все необходимые условия для keycloak и создал область, пользователя, роли

Я могу получить токен из Keycloak следующим образом -

export access_token=$(\
    curl -X POST http://localhost:8180/auth/realms/demo/protocol/openid-connect/token \
    --user demo-client:e0da2ad7-5f4c-49b3-ae54-dbd7a28d532a \
    -H 'content-type: application/x-www-form-urlencoded' \
    -d 'username=user&password=user&grant_type=password' | jq --raw-output '.access_token' \
 )

Но вот проблема при попытке получить доступ к точке отдыха /jwt/user

curl -v -H "Authorization: Bearer $access_token" http://localhost:8082/jwt/user

Это приводит к

< HTTP/1.1 403 Forbidden
< Content-Length: 9
< Content-Type: text/plain;charset=UTF-8
<
* Connection #0 to host localhost left intact
Forbidden* Closing connection 0

Вот подробности токена (я использую отладчик jwt.io, чтобы заглянуть внутрь токена)

Любая помощь будет высоко ценится

2 ответа

Используйте quarkus-oidc, следуйте https://quarkus.io/guides/security-openid-connect для сервисных приложений, которые принимают токены -носители

В Keycloak роль admin должна быть назначена демо-клиенту.

Что касается Quarkus JWT RBAC, расширение ожидает токен с утверждением «groups».

Существует конфигурация Quarkus JWT, используемая для сопоставления другого утверждения ролей (в данном случае realm_access/roles):

smallrye.jwt.path.groups="realm_access/роли"

Другие вопросы по тегам