邮递员使用 keycloak 返回 HTML 登录页面
Postman returning HTML login page with keycloak
我有一个简单的微服务项目,其中包含 api 网关、产品服务和作为身份验证服务器的 keycloak。我相信我的配置是正确的,因为在浏览器上我得到了正确的响应,但是在邮递员上我得到的响应是 keycloak 默认登录页面(在 HTML 上)。
这是浏览器上的响应
这是邮递员回复
Post男人饼干:
Api-网关配置:
spring:
cloud:
gateway:
default-filters:
- TokenRelay
routes:
- id: product-resource-server
uri: http://localhost:9191
predicates:
- Path=/product/**
security:
oauth2:
client:
provider:
my-keycloak-provider:
issuer-uri: http://localhost:2727/auth/realms/demo-microservice-realm
registration:
keycloak-spring-gateway-client:
provider: my-keycloak-provider
client-id: demo-cloud-gateway-client
client-secret: 39ea2ef6-90a7-47ca-9892-fda60127f47e
authorization-grant-type: authorization_code
redirect-uri: "{baseUrl}/login/oauth2/code/keycloak"
我的服务配置:
spring:
security:
oauth2:
resourceserver:
jwt:
jwk-set-uri: http://localhost:2727/auth/realms/demo-microservice-realm/protocol/openid-connect/certs
server:
port: 9191
产品控制器:
@RestController
public class Controller {
@GetMapping("/product")
// @RolesAllowed({"product_read"})
public String getProduct(Principal principal) {
return "Response from Product Service, User Id:" + principal.getName();
}
}
所以我真正想知道的是这是邮递员 Bug 还是配置问题(项目、keycloak ...)。
实际上我无法测试任何 Post 出于相同理由的请求,因为无法在浏览器上测试它们。
我希望这是可以理解的。
在邮递员中使用授权类型 oAuth2。 Postman 将您重定向到登录页面以从 keycloak 获取访问令牌并通过 Get New Access Token
按钮将其存储在内存中。然后,当您通过 Send
蓝色按钮向资源端点发送新请求时;邮递员在 header 字段(授权)上设置可用令牌并将其发送到服务器。因此,当 Authorization
header 未在您的请求中设置时。(例如,您第一次尚未获得新令牌)您的网关检测到 not authorize
错误并将您重定向到登录页面。
但在浏览器上,授权机制与您调用端点的方式完全不同。它使用存储的 cookie (JSESSION) 而不是令牌。您可以通过删除浏览器中所有存储的 cookie 来测试它。
好吧,我在 api 网关项目中添加了 spring-boot-starter-oauth2-resource-server
,它工作正常。
请参考本教程:Microservices – Authentication, and Authorization With Keycloak
我遇到了同样的问题
当我从 Postman 发送令牌请求时,我收到了一个带有 200 代码的响应,但是主体在 html,这是没有用的。
就我而言,我发现我只是写错了 url。所以解决方案是更正所谓的 url.
您的 url 应如下所示:
http://{wherever-your-keycloak-runs}/auth/realms/{name-of-your-realm}/protocol/openid-connect/token
但是我在 {wherever-your-keycloak-runs} 部分出错了,所以显然我调用了错误的键时钟部分。
我有一个简单的微服务项目,其中包含 api 网关、产品服务和作为身份验证服务器的 keycloak。我相信我的配置是正确的,因为在浏览器上我得到了正确的响应,但是在邮递员上我得到的响应是 keycloak 默认登录页面(在 HTML 上)。
这是浏览器上的响应
这是邮递员回复
Post男人饼干:
spring:
cloud:
gateway:
default-filters:
- TokenRelay
routes:
- id: product-resource-server
uri: http://localhost:9191
predicates:
- Path=/product/**
security:
oauth2:
client:
provider:
my-keycloak-provider:
issuer-uri: http://localhost:2727/auth/realms/demo-microservice-realm
registration:
keycloak-spring-gateway-client:
provider: my-keycloak-provider
client-id: demo-cloud-gateway-client
client-secret: 39ea2ef6-90a7-47ca-9892-fda60127f47e
authorization-grant-type: authorization_code
redirect-uri: "{baseUrl}/login/oauth2/code/keycloak"
我的服务配置:
spring:
security:
oauth2:
resourceserver:
jwt:
jwk-set-uri: http://localhost:2727/auth/realms/demo-microservice-realm/protocol/openid-connect/certs
server:
port: 9191
产品控制器:
@RestController
public class Controller {
@GetMapping("/product")
// @RolesAllowed({"product_read"})
public String getProduct(Principal principal) {
return "Response from Product Service, User Id:" + principal.getName();
}
}
所以我真正想知道的是这是邮递员 Bug 还是配置问题(项目、keycloak ...)。
实际上我无法测试任何 Post 出于相同理由的请求,因为无法在浏览器上测试它们。
我希望这是可以理解的。
在邮递员中使用授权类型 oAuth2。 Postman 将您重定向到登录页面以从 keycloak 获取访问令牌并通过 Get New Access Token
按钮将其存储在内存中。然后,当您通过 Send
蓝色按钮向资源端点发送新请求时;邮递员在 header 字段(授权)上设置可用令牌并将其发送到服务器。因此,当 Authorization
header 未在您的请求中设置时。(例如,您第一次尚未获得新令牌)您的网关检测到 not authorize
错误并将您重定向到登录页面。
但在浏览器上,授权机制与您调用端点的方式完全不同。它使用存储的 cookie (JSESSION) 而不是令牌。您可以通过删除浏览器中所有存储的 cookie 来测试它。
好吧,我在 api 网关项目中添加了 spring-boot-starter-oauth2-resource-server
,它工作正常。
请参考本教程:Microservices – Authentication, and Authorization With Keycloak
我遇到了同样的问题
当我从 Postman 发送令牌请求时,我收到了一个带有 200 代码的响应,但是主体在 html,这是没有用的。
就我而言,我发现我只是写错了 url。所以解决方案是更正所谓的 url.
您的 url 应如下所示:
http://{wherever-your-keycloak-runs}/auth/realms/{name-of-your-realm}/protocol/openid-connect/token
但是我在 {wherever-your-keycloak-runs} 部分出错了,所以显然我调用了错误的键时钟部分。