การใช้ PHP cURL เพื่อ POST ข้อมูลบน /oauth2/access_token และ GET data เป็น jSON

ฉันได้ทำตามขั้นตอนใน Path API เกี่ยวกับวิธีตรวจสอบสิทธิ์ผู้ใช้แล้ว ในกระบวนการรับรองความถูกต้องของบทช่วยสอน ผู้ใช้จะเริ่มเปลี่ยนเส้นทางไปยัง URL ต่อไปนี้และแจ้งให้ให้สิทธิ์การเข้าถึง:

https://partner.path.com/oauth2/authenticate?response_type=code&client_id=THE_CLIENT_ID

หลังจากนั้นเซิร์ฟเวอร์จะตอบกลับเป็น รหัส การอนุญาตผ่านที่อยู่ URL (ฉันได้ดำเนินการขั้นตอนนี้เสร็จสิ้นและได้รับ รหัส)

ตามที่อธิบายไว้ในเอกสาร ควรแลกเปลี่ยนรหัสสำหรับโทเค็นการเข้าถึงโดยใช้ /oauth2/access_token ตราบใดที่มีรหัสลูกค้าและความลับของลูกค้า (รับ access_token)

แต่ฉันไม่รู้ว่าจะโพสต์ข้อมูลผ่าน cURL ไปยังเซิร์ฟเวอร์ได้อย่างไร ฉันได้ลองใช้ตัวเลือกและการผสมผสาน curl_setopt() มากมาย แต่ก็ยังไม่ได้ผลอะไรเลย

จากเอกสาร คำขอมีลักษณะดังนี้:

POST /oauth2/access_token HTTP/1.1
Host: partner.path.com
Content-Type: application/x-www-form-urlencoded
Content-Length: <LENGTH>

grant_type=authorization_code&client_id=CLIENT&client_secret=SECRET&code=CODE

และรูปแบบ cURL เช่นนี้:

curl -X POST \
     -F 'grant_type=authorization_code' \
     -F 'client_id=CLIENT_ID' \
     -F 'client_secret=CLIENT_SECRET' \
     -F 'code=CODE' \
     https://partner.path.com/oauth2/access_token

และเซิร์ฟเวอร์จะให้คำตอบดังนี้:

HTTP/1.1 201 CREATED
Content-Type: application/json
Content-Length: <LENGTH>

{
    "code": 201,
    "type": "CREATED"
    "reason": "Created",
    "access_token": <ACCESS_TOKEN>,
    "user_id": <USER_ID>,
}

person Jhonny Jr.    schedule 14.07.2015    source แหล่งที่มา


คำตอบ (3)


หากต้องการดำเนินการคำขอ POST ใน PHP ด้วย cURL คุณสามารถดำเนินการดังนี้:

$handle = curl_init('https://partner.path.com/oauth2/access_token');
$data = array('grant_type' => 'authorization_code', 'client_id' => 'CLIENT', 'client_secret' => 'SECRET', 'code' => 'CODE');
curl_setopt($handle, CURLOPT_POST, true);
curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
$resp = curl_exec($handle);

จากนั้นคุณสามารถใช้ json_decode($json_encoded) เพื่อรับอาร์เรย์ที่เชื่อมโยงจากการตอบกลับของเซิร์ฟเวอร์

person Tris Emmy Wilson    schedule 14.07.2015
comment
ฉันใช้วิธีนั้นแล้วและทดสอบอีกครั้ง แต่ก็ยังไม่ได้ผลสำหรับฉัน :( ยังคงให้หน้าว่างแก่ฉันแม้ว่าฉันจะใช้ echo/print_r/var_dump จากตัวแปร $resp อยู่แล้ว - person Jhonny Jr.; 15.07.2015
comment
มันไม่ทำงานหรือคุณได้รับข้อความแสดงข้อผิดพลาดหรือไม่? คุณได้รับการตอบสนองจากเซิร์ฟเวอร์เลยหรือไม่? - person Tris Emmy Wilson; 15.07.2015
comment
ไม่ ฉันไม่ได้รับการตอบกลับจากเซิร์ฟเวอร์ มันแค่ใช้งานไม่ได้ :( แต่เมื่อฉันทดสอบโดยใช้บุรุษไปรษณีย์ มันทำงานได้ดี - person Jhonny Jr.; 15.07.2015
comment
คุณต้องใช้ http_build_query($data) ไม่เช่นนั้น content-type จะไม่ถูกตั้งค่าเป็น x-www-form-urlencoded - person Hans Z.; 15.07.2015

ไม่แน่ใจว่าคุณคิดออกหรือยังเนื่องจากฉันเห็นมันมาระยะหนึ่งแล้ว แต่ฉันเพิ่งพบปัญหานี้และนี่คือวิธีที่ฉันคิดออก

$code = $_GET['code'];
$url = 'https://YourPath/token?response_type=token&client_id='.$client_id.'&client_secret='.$client_secret.'&grant_type=authorization_code&code='.$code.'&redirect_uri='.$redirect_uri;

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST,true);

$exec = curl_exec($ch);
$info = curl_getinfo($ch);
print_r($info);
curl_close($ch);

$json = json_decode($exec);
if (isset($json->refresh_token)){
global $refreshToken;
$refreshToken = $json->refresh_token;
}

$accessToken = $json->access_token;
$token_type = $json->token_type;
print_r($json->access_token);
print_r($json->refresh_token);
print_r($json->token_type);

หวังว่าจะช่วยได้

person DennisOakdale    schedule 07.06.2016

นอกเหนือจากคำตอบของ Fox Wilson:

curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
person AlexanderPop    schedule 03.11.2017
comment
คุณควรเพิ่มสิ่งนี้เป็นความคิดเห็นในคำตอบที่ถูกกล่าวหาโดย @Fox Wilson - person Otieno Rowland; 03.11.2017
comment
ฉันกำลังจะไป แต่ได้ คุณต้องมีชื่อเสียง 50 ถึงจะแสดงความคิดเห็นได้ - person AlexanderPop; 05.11.2017