Cách chính xác để đặt mã thông báo Bearer với CURL


81

Tôi nhận được mã thông báo mang của mình từ điểm cuối API và đặt như sau:

$authorization = "Bearer 080042cad6356ad5dc0a720c18b53b8e53d4c274"

Tiếp theo, tôi muốn sử dụng CURL để truy cập vào điểm cuối an toàn, tuy nhiên tôi không chắc về cách thức hoặc vị trí đặt mã thông báo Bearer.

Tôi đã thử điều này nhưng nó không hoạt động:

 curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json' , $authorization ));
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS,$post);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    $result = curl_exec($ch);
    curl_close($ch);
    return json_decode($result);

BIÊN TẬP:

Theo tài liệu, tôi được cho là đang sử dụng mã thông báo mang tên như: https://apigility.org/documentation/auth/authentication-oauth2

GET /oauth/resource HTTP/1.1
Accept: application/json
Authorization: Bearer 907c762e069589c2cd2a229cdae7b8778caa9f07

Đây có phải là PHP không? Làm thế nào để máy chủ mong đợi mã thông báo này được gửi? Một tiêu đề?

Xin chào - vâng, đây là PHP, nói chung mã thông báo mang được đặt làm tiêu đề.
HappyCoder

Tên của tiêu đề là gì?

Tôi đã thêm một chỉnh sửa từ tài liệu.
HappyCoder

Câu trả lời:


115

Thay thế:

$authorization = "Bearer 080042cad6356ad5dc0a720c18b53b8e53d4c274"

với:

$authorization = "Authorization: Bearer 080042cad6356ad5dc0a720c18b53b8e53d4c274";

để làm cho nó trở thành tiêu đề Ủy quyền hợp lệ và hoạt động.


Xin chào - đây là điều tôi đã thử, tuy nhiên với cùng một vấn đề. Tôi nghi ngờ vấn đề có thể liên quan đến bản cập nhật Apigility, vì tôi cũng không thể làm cho bản cập nhật này hoạt động trên người đưa thư.
HappyCoder

Giải quyết vấn đề này bằng cách đưa ApiGility trở lại phiên bản ổn định trước đó. Cảm ơn ý kiến ​​đóng góp của bạn, mặc dù không phải là giải pháp của tôi, nhưng đó là giải pháp cho những người khác có vấn đề tương tự và nó đã đưa tôi đi đúng hướng. Cảm ơn về thông tin bạn vừa nhập!
HappyCoder

Bạn có thể giúp đỡ cho điều này? stackoverflow.com/questions/58581568/…
user4271704

36

Đây là một hàm cURL có thể gửi hoặc truy xuất dữ liệu. Nó sẽ hoạt động với bất kỳ ứng dụng PHP nào hỗ trợ OAuth:

    function jwt_request($token, $post) {

       header('Content-Type: application/json'); // Specify the type of data
       $ch = curl_init('https://APPURL.com/api/json.php'); // Initialise cURL
       $post = json_encode($post); // Encode the data array into a JSON string
       $authorization = "Authorization: Bearer ".$token; // Prepare the authorisation token
       curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json' , $authorization )); // Inject the token into the header
       curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
       curl_setopt($ch, CURLOPT_POST, 1); // Specify the request method as POST
       curl_setopt($ch, CURLOPT_POSTFIELDS, $post); // Set the posted fields
       curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // This will follow any redirects
       $result = curl_exec($ch); // Execute the cURL statement
       curl_close($ch); // Close the cURL connection
       return json_decode($result); // Return the received data

    }

Sử dụng nó trong các yêu cầu một chiều hoặc hai chiều:

$token = "080042cad6356ad5dc0a720c18b53b8e53d4c274"; // Get your token from a cookie or database
$post = array('some_trigger'=>'...','some_values'=>'...'); // Array of data with a trigger
$request = jwt_request($token,$post); // Send or retrieve data

Ai đó đã thêm một phiếu tiêu cực, bạn có thể giải thích thêm trong các ý kiến ​​bên dưới, xin vui lòng.
SergeDirect

2
Cảm ơn Serge ... Bạn đã vật lộn quá lâu với một cuộc gọi như thế này. TẤT CẢ các tài liệu đều nói "xây dựng mảng POST bằng http_build_query ()." NHƯNG điều đó không hoạt động - Tôi không biết đó có phải là đặc thù của OAuth hay không, nhưng thứ bạn cần là json_encode như bạn hiển thị ở đây. Gửi bia ảo.
anoldermark

2
@anoldermark Rất vui được hữu ích. Cảm ơn rất nhiều vì ngón tay cái lên, tạo ra sự khác biệt thực sự. Cần có thời gian và nỗ lực để viết câu trả lời chất lượng, lượt ủng hộ và nhận xét tích cực được khuyến khích ... viết nhiều hơn, viết hay;)
SergeDirect

@ SergeDirect, Làm thế nào chúng tôi sẽ nhận được các giá trị bài đăng trong tệp APPURL.com/api/json.php và cách hoạt động của jwt authitication. Vui lòng cho một ví dụ.
akgola

1
Bạn có thể giúp đỡ cho điều này? stackoverflow.com/questions/58581568/…
user4271704

11

Điều này sẽ hoạt động

$token = "YOUR_BEARER_AUTH_TOKEN";
//setup the request, you can also use CURLOPT_URL
$ch = curl_init('API_URL');

// Returns the data/output as a string instead of raw data
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

//Set your auth headers
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
   'Content-Type: application/json',
   'Authorization: Bearer ' . $token
   ));

// get stringified data/output. See CURLOPT_RETURNTRANSFER
$data = curl_exec($ch);

// get info about the request
$info = curl_getinfo($ch);
// close curl resource to free up system resources
curl_close($ch);

3

Ví dụ về câu đố:

use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;

$token = 'your_token';

$httpClient = new Client();

$response = $httpClient->get(
    'https://httpbin.org/bearer',
    [
        RequestOptions::HEADERS => [
            'Accept' => 'application/json',
            'Authorization' => 'Bearer ' . $token,
        ]
    ]
);

print_r($response->getBody()->getContents());

Xem https://github.com/andriichuk/php-curl-cookbook#bearer-auth


1

Như ở PHP 7.3:

curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BEARER);
curl_setopt($ch,CURLOPT_XOAUTH2_BEARER,$bearerToken);

0

Nếu bạn đang làm việc với mã thông báo riêng ( như API Gitlab ), bạn nên thay thế:

$authorization = "Authorization: Bearer 080042cad6356ad5dc0a720c18b53b8e53d4c274"

với:

$authorization = "PRIVATE-TOKEN 080042cad6356ad5dc0a720c18b53b8e53d4c274";


0
<?php
$curl = curl_init();

curl_setopt_array($curl, array(
CURLOPT_URL => "your api goes here",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => array(
"Authorization: Bearer eyJ0eciOiJSUzI1NiJ9.eyJMiIsInNjb3BlcyI6W119.K3lW1STQhMdxfAxn00E4WWFA3uN3iIA"
  ),
 ));

$response = curl_exec($curl);
$data = json_decode($response, true);

echo $data;

?>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.