具有标头的基本身份验证-Javascript XMLHttpRequest

具有标头的基本身份验证-Javascript XMLHttpRequest,javascript,xmlhttprequest,cors,basic-authentication,adyen,Javascript,Xmlhttprequest,Cors,Basic Authentication,Adyen,我正在尝试访问需要基本身份验证凭据的Adyen测试API 通过浏览器访问API页面时,我的凭据有效。 但是当我尝试使用XMLHttpRequest POST请求访问API时,会得到一个401未经授权的响应 Javascript代码 var url = "https://pal-test.adyen.com/pal/servlet/Payment/v25/authorise"; var username = "ws@Company.CompanyName"; var password = "J

我正在尝试访问需要基本身份验证凭据的Adyen测试API

通过浏览器访问API页面时,我的凭据有效。

但是当我尝试使用XMLHttpRequest POST请求访问API时,会得到一个401未经授权的响应

Javascript代码

var url = "https://pal-test.adyen.com/pal/servlet/Payment/v25/authorise";

var username = "ws@Company.CompanyName";
var password = "J}5fJ6+?e6&lh/Zb0>r5y2W5t";
var base64Credentials = btoa(username+":"+password);

var xhttp = new XMLHttpRequest();
xhttp.open("POST", url, true);
xhttp.setRequestHeader("content-type", "application/json");
xhttp.setRequestHeader("Authorization", "Basic " + base64Credentials);

var requestParams = XXXXXXXX;
xhttp.send(requestParams);

结果


该屏幕截图显示“请求方法:选项”,这表明显示的详细信息是由浏览器自动生成的,而不是您的
帖子

当您的浏览器发出
选项
请求时,它不会(也不能)发送
授权
标题,这会导致飞行前失败,因此浏览器永远不会继续尝试您的
POST

只要
https://pal-test.adyen.com/pal/servlet/Payment/v25/authorise
要求对
选项
请求进行身份验证,您无法成功地对其进行
POST

原因是这里发生的是:

  • 您的代码告诉您的浏览器它希望发送带有
    授权
    标题的请求
  • 您的浏览器显示,好的,带有
    授权
    标题的请求需要我执行CORS飞行前
    选项
    ,以确保服务器允许带有该标题的请求
  • 您的浏览器将
    选项
    请求发送到服务器,而无需
    授权
    标题
    ——因为
    选项
    检查的全部目的是查看是否可以发送该请求
  • 该服务器看到了
    选项
    请求,但没有以表示允许
    授权
    请求的方式响应请求,而是使用401拒绝请求,因为它缺少该头
  • 您的浏览器预期CORS飞行前会有200或204个响应,但会得到401个响应。因此,您的浏览器就停在那里,从不尝试代码发出的
    POST
    请求

  • PAL是一种支付授权API。你从来都不想从浏览器中调用它。您只想在后端代码中公开用户名和密码以发送付款

    在客户端加密中,加密在浏览器中完成。然后将加密数据发送到您自己的服务器。然后在服务器上创建一个支付授权请求(加密数据是其中的一个元素,以及支付金额等)

    如果您能够在浏览器上运行此功能,您的最终解决方案将允许您的购物者从JavaScript层更改金额、货币、支付元数据等。这种情况永远不应该发生

    因此,授权是文档“服务器端”集成部分的一部分:

    根据服务器端环境的不同,CURL实现在您喜欢的语言中有所不同,但大多数情况下很容易找到

    亲切问候,


    阿诺

    谢谢你的回答!但是应该有一种方法来访问api。你总是可以从后端代码访问它,但是如果它返回正确的访问控制头,那么它似乎也可以从浏览器中运行的前端JavaScript代码访问。但这并不意味着它实际上可以。他们的文档没有显示从前端JavaScript使用它的例子,如果需要这样的授权,预飞行是不可能工作的