2017-08-09 159 views
1

我想通过类似脚本中的XHR请求获得OAuth2令牌(https://developer.paypal.com/docs/integration/direct/make-your-first-call/)。我的代码到目前为止:从XHR请求获得OAuth2令牌请求

 var clientID = <clientID>; 
     var secret = <mySecret>; 

     var oReq = new XMLHttpRequest(); 
     oReq.open("POST", "https://api.sandbox.paypal.com/v1/oauth2/token", true); 

     oReq.setRequestHeader('grant_type', "client_credentials"); 
     oReq.setRequestHeader('Username', this.clientID); 
     oReq.setRequestHeader('Password', this.secret); 
     oReq.setRequestHeader('Content-type', "application/x-www-form-urlencoded"); 
     oReq.setRequestHeader('Accept', "application/json"); 
     oReq.setRequestHeader('Accept-Language', "en_US");   
     oReq.onreadystatechange = function() { 
      if (oReq.readyState === 4) { 
       if (oReq.status === 200) { 
        console.log(oReq.responseText); 
       } else { 
        console.log("Error: " + oReq.status); 
       } 
      }  
     console.log("Status: " + oReq.status); 
     }; 
     console.log("Status: " + oReq.status); 

     oReq.send(); 

不幸的是我不断收到401作为回应。我已经使用相同的clientID和secret来尝试curl命令,这对我来说很合适。有人能告诉我我的代码有什么问题吗?

回答

1

您得到401响应的请求不是您的POST请求,而是CORS预检OPTIONS请求浏览器自动进行。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests有什么触发浏览器做预检,但它归结于这个特定的情况下,你为了做认证加入grant_typeUsernamePassword请求头请求细节needed-但是您的浏览器在没有这些头文件的情况下进行预检OPTIONS请求(因为预检的目的是要求服务器指示接收包含这些请求头文件的请求是否正常)。

所以会发生什么情况如下(转载使用curl只是为了演示):

$ curl -X OPTIONS -i -H "Origin: http://example.com" \ 
    'https://api.sandbox.paypal.com/v1/oauth2/token' 

HTTP/1.1 401 Unauthorized 
Date: Wed, 09 Aug 2017 09:08:32 GMT 
Server: Apache 
paypal-debug-id: f8963606c5654 
Access-Control-Allow-Origin: http://example.com 
Access-Control-Expose-Headers: False 
HTTP_X_PP_AZ_LOCATOR: sandbox.slc 
Paypal-Debug-Id: f8963606c5654 
Set-Cookie: X-PP-SILOVER=name%3DSANDBOX3.API.1%26silo_version%3D1880%26app%3Dapiplatformproxyserv%26TIME%3D282167897%26HTTP_X_PP_AZ_LOCATOR%3Dsandbox.slc; Expires=Wed, 09 Aug 2017 09:38:32 GMT; domain=.paypal.com; path=/; Secure; HttpOnly 
Set-Cookie: X-PP-SILOVER=; Expires=Thu, 01 Jan 1970 00:00:01 GMT 
Content-Length: 0 
Connection: close 
Content-Type: text/plain; charset=ISO-8859-1 

也就是说,https://api.sandbox.paypal.com/v1/oauth2/token端点显然需要身份验证甚至OPTIONS请求。因为它的确如此,所以您无法直接从浏览器中运行的前端JavaScript代码向该端点发送POST请求。

所以你需要从后端代码发出请求。

+0

感谢您的回答!我背后的代理需要认证,并希望测试代码。既然这不起作用,我会找到另一种方法来测试我的代码。谢谢你的回答,真的节省了我一些时间:)编辑:代码应该在iOS模拟器上运行。 –