PHP cURL带身份验证API调用指南(REST GET/POST 全流程)

作者:API传播员 · 2025-10-08 · 阅读时间:4分钟
本文详细介绍了如何使用PHP的cURL库实现带身份验证的API调用,包括GET和POST请求。通过生成和使用auth-token,以及解决跨域问题,本文提供了完整的代码示例和技术指导,帮助开发者掌握带身份验证的API调用技术。

一. 概述

在使用 PHP 调用外部API时,身份验证是必不可少的环节。通过 cURL 库,您可以轻松实现带身份验证的 GETPOST 请求。

本文将详细讲解如何生成 auth-token 并在PHP和JavaScript中使用,实现安全高效的API调用。


二. 身份验证的必要性

某些API要求在请求中提供 auth-token(身份验证令牌)。
通常,API文档会说明如何生成 auth-token,例如通过提交 client_idclient_secretgrant_type

1. PHP生成auth-token示例

文件命名为 api/auth.php

$curl = curl_init();
$auth_data = array(
    'client_id' => 'XBnKaywRCrj05mM-XXX-6DXuZ3FFkUgiw45',
    'client_secret' => 'btHTWVNMUATHEnF-XXX-2nQabKcKVo3VXtU',
    'grant_type' => 'client_credentials'
);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $auth_data);
curl_setopt($curl, CURLOPT_URL, 'https://api-site.com/oauth/token');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
$result = curl_exec($curl);
if (!$result) {
    die("Connection Failure");
}
curl_close($curl);
echo $result;

注意:auth-token可能有时效限制(如两周),并且限制同时有效的数量。

2. JavaScript调用PHP生成auth-token

const apiAuth = async () => {
    try {
        const response = await fetch('https://my-site.com/api/auth.php');
        if (response.ok) {
            return response.json();
        }
        throw new Error(apiAuth_response: ${response});
    } catch (error) {
        console.error(apiAuth: ${error});
    }
};

三. cURL GET请求(带身份验证)

在GET请求中,通常将auth-token作为参数附加到URL:

if (isset($_POST['access_token'])) {
    $app_key = 'XBnKaywRCrj05m-XXX-v6DXuZ3FFkUgiw45';
    $utoken = $_POST['access_token'];
    $url = 'https://api-site.com/v1/apps/' . $app_key . '/reviews?utoken=' . $utoken;

    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    $result = curl_exec($curl);
    if (!$result) {
        die("Connection Failure");
    }
    curl_close($curl);
    echo $result;
}

JavaScript调用GET请求示例

const getAllReviews = async () => {
    const auth = await apiAuth();
    const data = {
        access_token: auth.access_token,
        token_type: auth.token_type,
    };
    try {
        $.post({
            type: 'POST',
            url: 'http://my-site.com/api/get_all_reviews.php',
            data: data,
        }).success(res => {
            const data = JSON.parse(res);
            const reviews = data.reviews;
            displayAllReviews(reviews, $('.review-list'));
        });
    } catch (error) {
        console.error(getAllReviews: ${error});
    }
};

displayAllReviews为自定义函数,用于处理和展示评论数据。


四. cURL POST请求(带身份验证)

POST请求同样需要auth-token,示例PHP文件 post_review.php

if (isset($_POST['success'])) {
    $p_url = 'https://product-link.com';
    $email = $_POST['email'];
    $post_array = array(
        'appkey' => 'XBnKaywRCrj05m-XXX-v6DXuZ3FFkUgiw45',
        'domain' => 'https://api-site.com',
        'product_url' => $p_url,
        'email' => $email,
        'review_content' => $_POST['message'],
        'review_title' => $_POST['title'],
        'review_score' => $_POST['star_rating_value']
    );
    postReview($post_array);
} else {
    $response = array(
        'response' => 'error',
        'message' => 'POST is required to use this function'
    );
}

function postReview($post_array) {
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $post_array);
    curl_setopt($curl, CURLOPT_URL, 'https://api-site.com/v1/reviews');
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    $result = curl_exec($curl);
    if (!$result) {
        die("Connection Failure");
    }
    curl_close($curl);
    echo $result;
}

JavaScript调用POST请求

function postSiteReview(data, form) {
    $.ajax({
        url: 'https://my-site.com/api/post_review.php',
        type: 'post',
        data: data,
        success: function (result) {
            let res = JSON.parse(result);
            if (res.code === 200) {
                form.find('.success-message').fadeIn();
            } else {
                let message = res.response === 'error' ? res.message : '';
                if (res.status && res.status.code === 500) {
                    message = res.status.message;
                }
                $('p.error-msg').text(Uh ooh.. ${message});
            }
        },
        error: function (err) {
            console.log('$.ajax error: ' + err);
        }
    });
}

五. 跨域问题处理

如果PHP文件和前端位于不同域名,可能会遇到 CORS 问题。解决方法:

header("Access-Control-Allow-Origin: https://my-site.com");

允许指定域名访问PHP文件,避免跨域错误。


六. 总结

通过本文示例,您已掌握:

  • 使用PHP cURLJavaScript 调用带身份验证的REST API
  • GETPOST 请求的实现方式
  • auth-token 的生成、传递与管理
  • 跨域访问问题的解决方案

无论是构建内部系统还是与第三方API集成,这些方法都能确保安全高效的数据交互。

原文链接: https://weichie.com/blog/php-curl-api-calls-authentication/