【问题标题】:ionic 3 header not sending Authorizaqtion 'bearer "token"' to serverionic 3 标头未将 Authorizaqtion 'bearer "token"' 发送到服务器
【发布时间】:2018-12-05 03:08:11
【问题描述】:

我正在做一个需要用户名和密码的登录屏幕。 如果登录成功,服务器将返回一个令牌。 然后我试图调用另一个函数来获取用户信息,但授权标头没有被传递。 我在邮递员上尝试了我的服务器方法,它工作正常,所以我相信问题出在标题中。有人可以告诉我应该怎么做吗?

let url = urlConst.Login;
let params1 = new HttpParams();

let loader = this.loadingcontroller.create({
  content: stringEngConst.signinngin
});

let attributes = {
  username: this.uname.value.toLowerCase(),
  password: this.password.value,
  grant_type: "password"
};

var headers = new HttpHeaders();
headers.append('Content-Type', 'application/x-www-form-urlencoded');
let body = 'username=' + this.uname.value.toLowerCase() + '&password=' + this.password.value + '&grant_type=password';
let data: Observable < any > = this.http.post(url, body, {
  headers: headers
});

loader.present().then(() => {

      data.subscribe(result => {
            if (result.access_token != null) {

              this.signintoken = result.access_token;
              this.storage.set(storageConst.SIGN_IN_TOKEN, result.token_type + " " + result.access_token);
              headers.append('Authorization', 'Bearer ' + this.signintoken);
              let url1 = 'http://localhost:57940/API/Account/GetUserInfo/';
              let info: Observable < any > = this.http.get(url1, {
                headers: headers
              });

              info.subscribe(result => {
                /*Do Something*/
              });
            }

请注意 result.access_token != null 为真。我成功地取回了令牌。但它不会再次传递给第二个 url (info)

【问题讨论】:

    标签: ionic-framework header ionic3 authorization http-get


    【解决方案1】:

    您正在使用与第一个 http 请求相同的标头:

    var headers = new HttpHeaders();
    headers.append('Content-Type', 'application/x-www-form-urlencoded');
    

    根据后续调用的终点,您可能需要以不同的方式设置标头:

    尝试使用

    创建新标题
    var headers2 = new HttpHeaders();
    headers.append('Content-Type', 'application/json');
    

    或者完全摆脱 Content-Type 取决于您的端点所期望的。

    此外,如果您使用的是 Ionic 3,则值得检查您使用的是哪个 Http 模块(HttpClient 或更旧的模块),因为它们在处理请求选项的方式上存在一些差异。

    【讨论】:

    • 我尝试了所有可能的方式。还没有任何效果:/尽管我在获取令牌时没有遇到它,但它正在引发 CORS 问题。
    【解决方案2】:

    看起来这个 SO 帖子可能会为您解决问题:https://stackoverflow.com/a/47805759/6599076

    您可能想使用:

    headers = headers.append('Authorization', 'Bearer ' + this.signintoken);

    【讨论】:

    • 这对我不起作用。我试过了,但现在它不再传递标题了。它给了我一个以前没有发生过的 CORS 问题。它说:“无法加载localhost:57940/API/Account/GetUserInfo:对预检请求的响应未通过访问控制检查:'Access-Control-Allow-Origin'标头包含多个值'localhost:8100,*',但只允许一个. Origin 'localhost:8100' 因此不允许访问。"
    • 听起来您现在遇到了不同的问题。 CORS 问题可能与令牌标头问题无关。听起来您的 API 没有正确处理 CORS,并且在 CORS 响应标头中发送了多个项目。您可能需要先解决这个问题,因为 OPTIONS HTTP 请求(针对 CORS)发生在任何其他 GET/POST 之前。
    • 请您告诉我如何测试它?
    • 在 Chrome 开发工具中,观察网络标签。我的猜测是您会看到对您的 API 的 OPTIONS 请求,但不会看到 GET 或 POST。如果为真,您可以查看响应标头。听起来您的 Access-Control-Allow-Origin 标头中将包含 2 个项目(本地主机:8100,*)。它应该只有 1。同样,这与您最初的请求标头问题完全不同。
    • 我相信这是一个选项问题。生病工作那个天使,让你知道结果。谢谢老哥
    猜你喜欢
    • 2018-10-23
    • 1970-01-01
    • 2017-10-16
    • 2012-01-07
    • 2018-08-31
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多