我已经阅读了很多关于此的问题,但似乎没有一个类似于我已经拥有JWT的边缘情况。
我在我的前端使用Auth0(注意auth-zero,而不是Oauth)来获得一个JWT,它为我的后端加载了范围和身份验证。当我登录到我的前端客户端时,我得到了一个带有access_token的JWT。如果我复制该令牌,我可以向我的后端微服务发出直接卷曲请求
curl -X GET -H "Authorization: Bearer TOKEN_HERE" -H "Cache-Control: no-cache" "http://192.168.0.109:39885"
这是按预期工作的,我收到了200回复。尼斯。
现在,当我通过我的Zuul代理尝试相同的卷曲请求时,我得到一个讨厌的401.
我的网关配置是:
@EnableHystrix
@EnableZuulProxy
@EnableEurekaClient
@SpringBootApplication
public class EdgeServiceApplication {
public static void main(String[] args) {
SpringApplication.run(EdgeServiceApplication.class, args);
}
}
现在阅读杰出的Syer博士的documentation和this对话,我知道我需要允许标题进入下游,我已经完成了:
zuul:
sensitiveHeaders:
routes:
instances:
path: /instances/**
serviceId: instance-service
restore:
path: /restore/**
serviceId: restore-service
设置sensitiveHeaders
为空应该允许所有内容(当然是为了测试)。
进一步查看文档,我看到我需要将@EnableOAuth2Sso
添加到我的Zuul配置中。这是我感到困惑/事情破裂的地方。
据我所知,@EnableOAuth2Sso
用于生成和验证令牌。我不想那样做。我已经为我的微服务准备好了很好的令牌(在那里验证了它)。
我如何告诉Zuul不要弄乱我的JWT而只是发送它们?
答案 0 :(得分:2)
我已经解决了这个问题,我的代码中有很多问题需要详细说明,但问题的要点是:
access_token
access_token
时,ember-simple-auth0实际上默认发送id_token
一旦我开始发送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
确保您不会使用以下内容从请求中删除标头:
zuul:
sensitiveHeaders:
routes:
instances:
path: /instances/**
serviceId: instance-service
stripPrefix: false
restore:
path: /restore/**
serviceId: restore-service
stripPrefix: false
希望有人觉得这很有用。