Spring 云Zuul向下游传递JWT
Spring cloud Zuul pass JWT downstream
我已经阅读了很多关于此的问题,但 none 似乎与我的 edge-case 相似,我已经有了我的 JWT。
我在我的前端使用 Auth0(注意 auth-zero,而不是 Oauth)来获得一个 JWT,它为我的后端加载了范围和身份验证。当我登录到我的前端客户端时,我得到了一个带有 access_token 的不错的 JWT。如果我复制该令牌,我可以向我的后端微服务发出直接的 curl 请求
curl -X GET -H "Authorization: Bearer TOKEN_HERE" -H "Cache-Control: no-cache" "http://192.168.0.109:39885"
这按预期工作,我收到了 200 响应。好的。
现在,当我通过我的 Zuul 代理尝试相同的 curl 请求时,我得到了一个讨厌的 401。
我的网关配置是:
@EnableHystrix
@EnableZuulProxy
@EnableEurekaClient
@SpringBootApplication
public class EdgeServiceApplication {
public static void main(String[] args) {
SpringApplication.run(EdgeServiceApplication.class, args);
}
}
现在阅读才华横溢的 Syer 博士的 documentation and this 对话,我知道我需要让 headers 顺流而下,我已经这样做了:
zuul:
sensitiveHeaders:
routes:
instances:
path: /instances/**
serviceId: instance-service
restore:
path: /restore/**
serviceId: restore-service
设置 sensitiveHeaders
空应该允许所有内容(当然是为了测试)。
进一步查看我看到的文档,我需要将 @EnableOAuth2Sso
添加到我的 Zuul 配置中。这是我 confused/things 休息的地方。
据我所知,@EnableOAuth2Sso
用于生成和验证令牌。我不想那样做。我已经为我的微服务准备好我的好令牌(在那里验证它)。
我如何告诉 Zuul 不要弄乱我的 JWT 并直接发送它们?
我已经解决了这个问题,我的代码有很多问题需要详细说明,但问题的要点是:
- 我本应发送
access_token
,但我试图将整个 JWT 发送到微服务
- 当我尝试发送
access_token
时,ember-simple-auth0 实际上默认发送 id_token
- 我需要配置 Zuul 以将 CORS 请求直接传递给微服务
一旦我开始发送 access_token
而不是 id_token
,就很容易开始调试问题。
告诉 ember-simple-auth0 使用 access_token
而不是添加一个新的授权者,如下所示:
// app/authorizers/application.js
import Ember from 'ember';
import BaseAuthorizer from 'ember-simple-auth/authorizers/base';
const {
isPresent,
debug
} = Ember;
export default BaseAuthorizer.extend({
authorize(sessionData, block) {
let userToken = sessionData['accessToken'];
if (isPresent(userToken)) {
block('Authorization', `Bearer ${userToken}`);
} else {
debug('Could not find the authorization token in the session data for the jwt authorizer.');
}
}
});
然后记得告诉您的适配器使用新的授权方:
export default DS.JSONAPIAdapter.extend(DataAdapterMixin, {
authorizer: 'authorizer:application',
});
要将 CORS 转发到您的微服务,请使用:
spring:
mvc:
dispatch-options-request: true
并确保您没有从请求中删除 headers:
zuul:
sensitiveHeaders:
routes:
instances:
path: /instances/**
serviceId: instance-service
stripPrefix: false
restore:
path: /restore/**
serviceId: restore-service
stripPrefix: false
希望有人觉得这有用。
我已经阅读了很多关于此的问题,但 none 似乎与我的 edge-case 相似,我已经有了我的 JWT。
我在我的前端使用 Auth0(注意 auth-zero,而不是 Oauth)来获得一个 JWT,它为我的后端加载了范围和身份验证。当我登录到我的前端客户端时,我得到了一个带有 access_token 的不错的 JWT。如果我复制该令牌,我可以向我的后端微服务发出直接的 curl 请求
curl -X GET -H "Authorization: Bearer TOKEN_HERE" -H "Cache-Control: no-cache" "http://192.168.0.109:39885"
这按预期工作,我收到了 200 响应。好的。
现在,当我通过我的 Zuul 代理尝试相同的 curl 请求时,我得到了一个讨厌的 401。
我的网关配置是:
@EnableHystrix
@EnableZuulProxy
@EnableEurekaClient
@SpringBootApplication
public class EdgeServiceApplication {
public static void main(String[] args) {
SpringApplication.run(EdgeServiceApplication.class, args);
}
}
现在阅读才华横溢的 Syer 博士的 documentation and this 对话,我知道我需要让 headers 顺流而下,我已经这样做了:
zuul:
sensitiveHeaders:
routes:
instances:
path: /instances/**
serviceId: instance-service
restore:
path: /restore/**
serviceId: restore-service
设置 sensitiveHeaders
空应该允许所有内容(当然是为了测试)。
进一步查看我看到的文档,我需要将 @EnableOAuth2Sso
添加到我的 Zuul 配置中。这是我 confused/things 休息的地方。
据我所知,@EnableOAuth2Sso
用于生成和验证令牌。我不想那样做。我已经为我的微服务准备好我的好令牌(在那里验证它)。
我如何告诉 Zuul 不要弄乱我的 JWT 并直接发送它们?
我已经解决了这个问题,我的代码有很多问题需要详细说明,但问题的要点是:
- 我本应发送
access_token
,但我试图将整个 JWT 发送到微服务
- 当我尝试发送
access_token
时,ember-simple-auth0 实际上默认发送id_token
- 我需要配置 Zuul 以将 CORS 请求直接传递给微服务
一旦我开始发送 access_token
而不是 id_token
,就很容易开始调试问题。
告诉 ember-simple-auth0 使用 access_token
而不是添加一个新的授权者,如下所示:
// app/authorizers/application.js
import Ember from 'ember';
import BaseAuthorizer from 'ember-simple-auth/authorizers/base';
const {
isPresent,
debug
} = Ember;
export default BaseAuthorizer.extend({
authorize(sessionData, block) {
let userToken = sessionData['accessToken'];
if (isPresent(userToken)) {
block('Authorization', `Bearer ${userToken}`);
} else {
debug('Could not find the authorization token in the session data for the jwt authorizer.');
}
}
});
然后记得告诉您的适配器使用新的授权方:
export default DS.JSONAPIAdapter.extend(DataAdapterMixin, {
authorizer: 'authorizer:application',
});
要将 CORS 转发到您的微服务,请使用:
spring:
mvc:
dispatch-options-request: true
并确保您没有从请求中删除 headers:
zuul:
sensitiveHeaders:
routes:
instances:
path: /instances/**
serviceId: instance-service
stripPrefix: false
restore:
path: /restore/**
serviceId: restore-service
stripPrefix: false
希望有人觉得这有用。