【问题标题】:jQuery JSONP ajax, authentication header not being setjQuery JSONP ajax,未设置身份验证标头
【发布时间】:2011-11-18 00:19:03
【问题描述】:

我正在尝试使用以下设置向 google 联系人 API 发出 ajax 请求:

$.ajax({
  url: "https://www-opensocial.googleusercontent.com/api/people/@me/@all",
  dataType: 'jsonp',
  data: {
    alt: 'json-in-script'
  },
  headers: {
    'Authorization': 'Bearer ' + token
  },
  success: function(data, status) {
    return console.log("The returned data", data);
  }
});

但 Authentication 标头似乎没有设置。有什么想法吗?

【问题讨论】:

  • 你用的是什么版本的jQuery?
  • jQuery .ajax 确实有 'username' 和 'password' 字段可以在需要时为您进行基本身份验证

标签: javascript jquery http-headers jsonp


【解决方案1】:

我最近遇到了同样的问题。试试这个:

$.ajax({
  url: "https://www-opensocial.googleusercontent.com/api/people/@me/@all",
  dataType: 'jsonp',
  data: {
    alt: 'json-in-script'
  },
  success: function(data, status) {
    return console.log("The returned data", data);
  },
  beforeSend: function(xhr, settings) { xhr.setRequestHeader('Authorization','Bearer ' + token); } 
});

编辑:看起来它不能用 JSONP 完成。 Modify HTTP Headers for a JSONP request

【讨论】:

  • xhr.setRequestHeader 也不起作用。看来我需要阅读您链接到的问题。
【解决方案2】:

当跨域请求需要身份验证时,您必须使用某种代理服务器。

由于使用 dataType: jsonp 会导致 HTTP 请求实际上是由添加到 DOM 的脚本发出的,因此不会使用 $.ajax 中设置的标头。

【讨论】:

    【解决方案3】:

    似乎大多数 OAUTH2 REST 资源都接受 access_token 参数作为请求 url 的一部分

    http://self-issued.info/docs/draft-ietf-oauth-v2-bearer.html#query-param

    请尝试以下代码:

    $.ajax({
                dataType: 'jsonp',
                url: url,                
                data: {
                    'access_token':token.access_token
                },
                jsonpCallback: 'thecallback',
                success: function(data){
                    _cb(data);
                },
                error: function(d){
                    _cb(d);
                }
            });
    

    【讨论】:

      【解决方案4】:

      只需这样做(jquery 2.0,但应该在以前的版本中工作)

          $.ajax({
              url: "/test",
              headers: {"Authorization": "Bearer " + $('#myToken').val()}
          })           
          .done(function (data) {
            console.log(data);
          })
          .fail(function (jqXHR, textStatus) {
            alert("error: " + textStatus);
          });
      

      【讨论】:

      • 好的,但这不是 JSONP ajax 请求。这是普通的 ajax 请求。
      • headers 选项应该是有效的,即使它的 JSONP。请求标头是 HTTP 协议的一部分,JSONP 是应用程序/浏览器级别的 hack。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-26
      • 1970-01-01
      • 1970-01-01
      • 2019-02-21
      • 2017-08-12
      • 2011-09-11
      相关资源
      最近更新 更多