【问题标题】:401 Unauthorized Error Angular 5401未经授权的错误角度5
【发布时间】:2019-01-06 11:13:03
【问题描述】:
obtainAccessToken(loginData){
        let params=new URLSearchParams();
        params.append('grant_type','password');
        params.append('username',loginData.username);
        params.append('password',loginData.password);
        params.append('client_id','myid');
        console.log(params.toString());
        let headers = new Headers();
        headers.append('content_type','application/x-www-form-urlencoded');
        headers.append('Authorization','Basic '+btoa("myid:mypaasword"));
        console.log(headers)
        let options=new RequestOptions({headers:headers});
        console.log(options);
        this._http.post('...../oauth/token',params.toString(),options)
            .pipe(map(res=>res.json(),err=>console.log(err)))
            .subscribe(
                data=>this.saveToken(data),
                err=>alert('Invalid Credials')
            );
        }

在发送帖子请求以访问我的 Spring 应用 enter image description here 时,我总是收到 401 Unauthorized 错误

【问题讨论】:

    标签: spring angular oauth-2.0 angular5


    【解决方案1】:

    它不是来自 Spring。这是一个浏览器安全。 我想您的 spring 服务器位于前端服务器之外的另一个端口(或另一个 IP?)。

    浏览器不允许向另一个端口/IP 发出 ajax 请求(出于安全原因)。它被称为 CORS : https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS

    在服务器端,您必须将标头添加到您的 HttpServletResponse 以明确允许您的客户端域请求您的服务器。

    【讨论】:

    • 我真的不明白。我是 spring oauth 的新手,这是我第一次使用它,我必须做什么。如何向 HttpServletResponse 添加标头?
    • 您好,请确保确实是CORS问题(您的客户端和服务器上的端口不同)。您可以通过尝试使用 curl 或 postman 执行完全相同的请求来检查这一点。如果你得到同样的错误,CORS 就是你的问题。您可以在此处找到有关在春季实施 CORS 的文档:spring.io/guides/gs/rest-service-cors
    • 不,它与邮递员合作,服务器向我发送访问令牌。客户端和服务器在不同的端口工作。我认为问题不是来自 CORS,因为我将 @CrossOrigin("*") 添加到了我的 restControllerClass。
    • 不,正如您所描述的,它是 CORS。 @CrossOrigin("*") 不能工作,另一个浏览器安全性,它不允许授权所有来源。检查您在 Chrome 中的响应标头,看看响应是否正确。
    • 访问控制允许凭据:真访问控制允许标头:授权,内容类型访问控制允许方法:POST 访问控制允许来源:..... ..... 允许:GET、HEAD、POST、PUT、DELETE、TRACE、OPTIONS、PATCH 缓存控制:无缓存、无存储、最大年龄=0、必须重新验证内容长度:0 日期: 2018 年 7 月 30 日星期一 09:46:05 GMT 过期时间:0 Pragma: no-cache Vary: Access-Control-Request-Headers Vary: Origin Vary: Access-Control-Request-Method WWW-Authenticate: Basic realm="oauth2/客户端" X-Content-Type-Options: nosniff
    【解决方案2】:

    在浏览器中添加 cors 插件

    firefox--> https://addons.mozilla.org/en-US/firefox/addon/cors-everywhere/

    铬--> https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl=en

    关闭插件并再次打开它。

    如果它有效,那么问题出在你的 rest api 上。 在控制器中添加 @crossorigin() 按照这个链接: https://howtodoinjava.com/spring5/webmvc/spring-mvc-cors-configuration/ https://spring.io/guides/gs/rest-service-cors/

    【讨论】:

    • 尝试使用这个@CrossOrigin(origins="localhost:4200", allowedHeaders="*", methods={RequestMethod.POST})
    • 我试过了,但同样的问题。我现在正在使用带角度的代理,但它返回错误 400 错误请求
    • 对于 Angular 中的 http 请求,您使用的是 HttpClient 还是 http??
    • 我正在使用 http,但我尝试使用 httpclient,但问题相同
    • 你能分享代码吗?这将有助于追踪问题
    猜你喜欢
    • 2019-01-12
    • 1970-01-01
    • 2018-04-16
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 2015-10-14
    相关资源
    最近更新 更多