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

希望有人觉得这有用。