2017-08-09 158 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模擬器上運行。 –