使用jQuery.ajax请求和jsonp实现基本认证

15

我有一些本地的html/js文件,想要通过https调用一些远程服务器,最终使用基本认证(Basic Authentication)进行请求。

我遇到了两个问题。首先,如果我不为dataType指定'jsonp',则jQuery.ajax()请求会返回错误:

访问受限制的URI时出错,代码:1012

我的请求是否被视为跨域请求,因为我的主工作文件存储在本地,但是从其他地方检索数据?

所以,好吧,我更新了调用,现在它看起来像:

$.ajax({ 
     url: myServerUrl,
     type: "GET", 
     dataType: "jsonp", // considered a cross domain Ajax request if not specified
     username: myUsername,
     password: myPassword,

     success: function(result)
     {
        // success handling
     },
     error: function(req, status, errThrown){
         // error handling
     }
})
因为我需要使用基本身份验证,所以我传递了用户名/密码,但是如果我监视请求,我发现它没有被设置,此外,服务器发送错误响应,因为它没有预期的信息。
另外,由于我设置了jsonp,beforeSend将不会被调用。
如何在此请求中使用基本身份验证传递凭据?
3个回答

12
简而言之,你无法这样做。你的猜测是正确的,因为你是本地的,而这些文件是远程的,所以你无法访问它们,你被同源策略阻止了。解决方法是使用JSONP,但这似乎并不适用于你的情况...
JSONP的工作方式不同,它是通过<script>标签包含的GET请求来获取文件的,因此您不需要发送特殊的头文件或其他内容。
你需要通过你所在的服务器(脚本运行的域)或其他代理选项代理请求,但从客户端到另一个域是被阻止的,主要是出于安全原因。

5
这是正确的答案,JSONP无法包含Basic Auth所需的USER/PWD标头。所以你做或不做都会有问题 :) - Doug Molineux

7

1
使用此语法将在Chrome M59版本中被阻止:https://www.chromestatus.com/feature/5669008342777856 - Ben Hull

0

我认为你需要添加一个服务器代理。JSONP只是使用脚本标签的一种特定方式。因此,它不允许设置任意标头。当然,你也不能进行跨域XHR。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接