首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用密钥罩的Docker JAX-RS应用编程接口安全性-始终返回401未经授权(在KumuluzEE容器中运行)

使用密钥罩的Docker JAX-RS应用编程接口安全性-始终返回401未经授权(在KumuluzEE容器中运行)
EN

Stack Overflow用户
提问于 2019-05-16 15:20:17
回答 1查看 225关注 0票数 0

我一直在遵循这个guide,用Keycloak保护我的JAX-RS。我正在执行它提供的所有步骤,但遗憾的是,我无法让我的身份验证正常工作。我的请求总是导致401响应。我希望你们中的一些人能帮助我解决这个问题。

我使用docker-compose来运行所有的容器。

docker-compose.yaml

代码语言:javascript
复制
version: '3'

services:
  products:
    image: maven:alpine
    volumes:
      - ./products/target/:/usr/src/products
    command: java -jar /usr/src/products/products-0.0.1.jar
    environment:
      MYSQL_USER: mysql
      MYSQL_PASS: mysql
    ports:
      - 8000:8080
    networks:
      - keycloak

  keycloak:
    image: jboss/keycloak
    environment:
      KEYCLOAK_USER: keycloak
      KEYCLOAK_PASSWORD: keycloak
      DB_VENDOR: postgres
      DB_ADDR: keycloakDb
      DB_USER: keycloak
      DB_PASSWORD: password
    ports:
      - 8100:8080
    depends_on:
      - keycloakDb
    networks:
      - keycloak

  keycloakDb:
    image: postgres
    volumes:
      - ./volumes/keycloak/data:/var/lib/postgresql
    environment:
      POSTGRES_DB: keycloak
      POSTGRES_USER: keycloak
      POSTGRES_PASSWORD: password
    networks:
      - keycloak

networks:
  keycloak:
    driver: bridge

我使用这些设置来配置Kumuluz

config.yaml

代码语言:javascript
复制
kumuluzee:
  security:
    keycloak:
      json: '{
               "realm": "producerstore-realm",
               "bearer-only": true,
               "auth-server-url": "http://keycloak:8080/auth",
               "ssl-required": "external",
               "resource": "producerstore-api",
               "confidential-port": 0
             }'

下面是我的JAX-RS应用程序和一个REST资源。

Api.java

代码语言:javascript
复制
@ApplicationPath("")
@DeclareRoles({"admin", "customer"})
public class Api extends Application {
}

ProductResource.java

代码语言:javascript
复制
@GET
@PermitAll
@Path("/products")
public Response getAll() {
    try {
        return Response.ok()
            .entity(service.getAll())
            .build();
    } catch (Exception e) {
        return internalServerError(e.getMessage());
    }
}

@POST
@RolesAllowed({"admin"})
@Path("/products")
public Response createProduct(ProductDto productDto, @Context UriInfo uriInfo) {
    try {
        long createdId = service.add(productDto);

        URI uri = uriInfo.getAbsolutePathBuilder()
                            .segment(Long.toString(createdId))
                            .build();

        return Response.created(uri)
            .build();
    } catch (CreationException e) {
        return internalServerError(e.getMessage());
    }
}

我还在Keycloak中定义了管理员和客户角色。接下来,我创建了一个用户,并将这些角色分配给他们。

当我使用该用户登录时,我收到了正确的JWT。

代码语言:javascript
复制
curl -X POST \
  http://localhost:8100/auth/realms/producerstore-realm/protocol/openid-connect/token \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -d 'grant_type=password&client_id=producerstore-app&username=<username>&password=<password>'

这会产生以下令牌

代码语言:javascript
复制
{
    "access_token": "<very-long-token>",
    "expires_in": 300,
    "refresh_expires_in": 1800,
    "refresh_token": "<another-very-long-token>",
    "token_type": "bearer",
    "not-before-policy": 0,
    "session_state": "770908df-08fa-4935-8666-a58ae41447e7",
    "scope": "profile email"
}

但是当我尝试请求我的资源时,结果总是出现401。

代码语言:javascript
复制
curl -X GET \
  http://localhost:8000/products \
  -H 'Authorization: Bearer <very-long-token>'
代码语言:javascript
复制
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
        <title>Error 401 Unauthorized</title>
    </head>
    <body>
        <h2>HTTP ERROR 401</h2>
        <p>Problem accessing /products. Reason:

            <pre>    Unauthorized</pre>
        </p>
        <hr>
        <a href="http://eclipse.org/jetty">Powered by Jetty:// 9.4.15.v20190215</a>
        <hr/>
    </body>
</html>

我希望你们中的一些人能帮助我解决这个问题,如果你们需要更多关于某事的信息,我很乐意提供。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2019-06-23 18:36:24

我非常确信令牌颁发者URL与配置中的领域URL不匹配。尝试使用以下keycloak docker-compose.yml配置:

代码语言:javascript
复制
version: '3'

keycloak:
    image: jboss/keycloak
    environment:
      KEYCLOAK_USER: keycloak
      KEYCLOAK_PASSWORD: keycloak
      KEYCLOAK_HOSTNAME: keycloak
      DB_VENDOR: postgres
      DB_ADDR: keycloakDb
      DB_USER: keycloak
      DB_PASSWORD: password
    ports:
      - 8080:8080
    depends_on:
      - keycloakDb
    networks:
      - keycloak

keycloak映射添加到您的主机文件,以便您可以在docker外部访问keycloak

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56162890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档