Spring cloud Zuul通过JWT下游

时间:2017-11-18 04:48:14

标签: java spring-boot spring-security netflix-zuul spring-cloud-netflix

我已经阅读了很多关于此的问题,但似乎没有一个类似于我已经拥有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博士的documentationthis对话,我知道我需要允许标题进入下游,我已经完成了:

zuul:
  sensitiveHeaders:
  routes:
    instances:
      path: /instances/**
      serviceId: instance-service
    restore:
      path: /restore/**
      serviceId: restore-service

设置sensitiveHeaders为空应该允许所有内容(当然是为了测试)。

进一步查看文档,我看到我需要将@EnableOAuth2Sso添加到我的Zuul配置中。这是我感到困惑/事情破裂的地方。

据我所知,@EnableOAuth2Sso用于生成和验证令牌。我不想那样做。我已经为我的微服务准备好了很好的令牌(在那里验证了它)。

我如何告诉Zuul不要弄乱我的JWT而只是发送它们?

1 个答案:

答案 0 :(得分:2)

我已经解决了这个问题,我的代码中有很多问题需要详细说明,但问题的要点是:

  • 当我刚刚发送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

确保您不会使用以下内容从请求中删除标头:

zuul:
  sensitiveHeaders:
  routes:
    instances:
      path: /instances/**
      serviceId: instance-service
      stripPrefix: false

    restore:
      path: /restore/**
      serviceId: restore-service
      stripPrefix: false

希望有人觉得这很有用。