Spring Oauth2 Auth JS Rest Bearer标头已随CORS删除,但Call可与access_token参数一起使用

时间:2018-09-25 08:37:41

标签: spring cors

我一直在努力为springboot 2和oauth 2.3设置CORS的正确方法。 因此,我创建了一个简单的一类应用程序,希望它能按预期运行,但可惜情况并非如此。

我通过AXIOS调用了该应用程序。

    @CrossOrigin(origins = "*")
@RestController
@EnableResourceServer
@SpringBootApplication
public class App {

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

    @PostMapping("/getData")
    public String getData(Principal principal) {

        return "GotData";
    }

    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        final CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList(new String[] {"*"}));
        configuration.setAllowedMethods(Arrays.asList(new String[] {"HEAD",
                "GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"}));
        configuration.setAllowCredentials(true);
        configuration.setAllowedHeaders(Arrays.asList(new String[] {"*"}));
        configuration.setExposedHeaders(Arrays.asList(new String[] {"X-Auth-Token","Authorization","Access-Control-Allow-Origin","Access-Control-Allow-Credentials"}));
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }

}

这是进行调用的js方法

    async bla() {
    var accessToken = await Vue.prototype.$auth.getAccessToken();
    axios.post('http://localhost:8055/getData','whaever',
            {headers: {
                'Authorization': ['Bearer ' + accessToken],
                'Access-Control-Allow-Origin': '*'
              }}
    ).then(response => {
      alert(response.data)
      }).catch(e => {
        alert('failed ' + e.message);
    })
  }

结果是:“错误”:“未经授权” Axios没有发送Bearer令牌或access-control-allow-origin头。

当我将Spring Rest端点更改为GetMethod并按如下所示传递access_token时。

    Spring class change
@CrossOrigin(origins = "*")
@RestController
@EnableResourceServer
@SpringBootApplication
public class App {

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

    @GetMapping("/getData")
    public String getData(Principal principal) {

        return "GotData ";
    } 

和js调用:

    async bla() {
        var accessToken = await Vue.prototype.$auth.getAccessToken();
        axios.get('http://localhost:8055/getData',
                {headers: {
                    //'Authorization': ['Bearer ' + accessToken],
                    'Access-Control-Allow-Origin': '*'
                  },
                  params: {
                    'access_token': accessToken
                  }
               }
        ).then(response => {
          alert(response.data)
          }).catch(e => {
            alert('failed ' + e.message);
        })
      },

在使用oauth 2.3设置Spring Boot 2的CORS时,有人可以建议我做错了什么吗? 或遇到相同的问题。我以为这是标准设置并可以正常工作,但一直在努力使其工作到现在我要破解的代码,以继续前进,直到我可以使用Post方法为止。

添加Chrome网络捕获: Get method headers, success response, just access_token as param

,这是失败的Post呼叫: failed Post headers failed 401 result 谢谢

更新: 感谢您的所有回复。 围着圈子跑来跑去,试图将Bearer令牌发送到春天。 -当尝试通过邮递员在数组中发送承载令牌时,我得到access_denied:需要完全身份验证,因此Spring应用程序看不到身份验证令牌 -当我发送带有Bearer令牌作为字符串的Postman Post呼叫时,它起作用 -当我发送带有access_token参数的邮递员帖子时,效果也很好

-当我尝试通过Axios将Bearer令牌作为字符串或数组发送时,我的手指 -当我通过axios为该帖子发送一个access_token时,它的工作原理与get请求一样。 启用Oauth2的Not CORS时,Bearer令牌功能可与Post一起使用。 该功能也可以在不启用EnableResourceServer且禁用oauth2的情况下使用。 如果找不到可行的解决方案,就无法继续花费时间。

comms已经过https了,所以现在暂时将access_tokens作为参数发送,并可能尝试使用scala / golang / kotlin或其他具有较少抽象层的docker尝试使用其他Java框架,并查看它是否可以更轻松地解决类似阻止程序的问题这些。

很高兴找出如何解决此承载令牌问题,因此,如果有人想运行我发布的带有承载令牌的有效解决方案的代码,请告诉我结果。

也许我缺少一些mvn库来使其正常工作? 另外,也可以禁止Axios并查看jquery是否会解决问题,尽管每个人在搜索最佳实践/趋势时都说jquery已过时。如果jquery没有设置承载令牌,则access_token可以解决。不想花更多时间解决问题。

如果我发送一个access_token参数,则可能会出现Oauth2 Spring安全问题,而不是CORS,因为该调用有效,但是如果我尝试发送承载身份验证令牌,则失败。

我从在线论坛上猜测,Spring Boot不会在预调用握手中发送正确的标头,因此,无论哪个lib wrap ajax调用都将删除auth标头(尽管可能是错误的)。 PS !!在发布此问题之前,我也尝试过使用纯ajax调用,而ajax也未发送承载令牌。

无论哪种方式,如果其他人陷入困境,一种快速的解决方法是在rest调用上设置access_token参数,而不是auth承载令牌。

此外,我有上面所示的POST axios调用,它不需要CORS,并且可以与发送的承载令牌一起按预期工作。

0 个答案:

没有答案