You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP解析重定向URL中的授权码以获取OAuth Bearer Token

如何在PHP中从重定向URL解析OAuth授权码?

我需要从重定向URL中解析授权码,用于后续获取OAuth Bearer Token。想找类似Python的requests模块和web模块的PHP库,实现如下Python代码的功能:

class ILToken(object):
    def GET(self):
        form = web.input(code=None, scope=None) 

举个例子:我的重定向URL设置为http://redirect_example.com/oauth/,点击登录按钮后,授权链接https://api.provider.com/oauth/authorize?response_type=code&redirect_uri=http://redirect_example.com/oauth/...会将用户重定向到http://redirect_example.com/oauth/?code=ExampleAuthCode,我需要提取其中的code参数。

我尝试的PHP代码(无效)

我用curl尝试实现,但没成功:

# Initialize curl request parameters
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, env('INSTANT_LOGIN_URI'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, TRUE); // We'll parse redirect url from header.
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE);

# Set variables and execute
$output = curl_exec($ch);
$response_code = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
$redirect = curl_getinfo($ch, CURLINFO_REDIRECT_URL);
curl_close($ch);

# Print Results
print $redirect;

相关资料提到设置FOLLOWLOCATION为true并使用CURLINFO_EFFECTIVE_URL获取代码,但对我无效。我的环境是Ubuntu系统下的PHP 7.4,应用基于Laravel框架,部署在Nginx 1.21服务器上。


解决方案

核心问题说明

你之前的curl思路错误:OAuth授权码流程是用户在浏览器中完成登录授权,服务端会跳转到你设置的redirect_uri并携带code参数,这个请求是浏览器发起的GET请求到你的回调路由,而非服务器端curl请求能模拟——curl是服务器主动请求授权地址,不会触发用户登录流程,自然拿不到带code的重定向。

对应Python库的PHP工具

  • 替代requests:Guzzle,PHP最流行的HTTP客户端,Laravel默认集成,用于后续调用接口获取Bearer Token。
  • 替代web.py的web.input:Laravel Request,用于处理HTTP请求参数,安全便捷;原生PHP也可直接用$_GET,但Laravel的Request支持默认值、参数验证等功能。

Laravel环境下的正确实现

  1. 定义回调路由
    在routes/web.php中添加:
Route::get('/oauth', 'App\Http\Controllers\OAuthController@handleCallback');
  1. 编写控制器处理回调
    创建OAuthController.php,提取code并获取Bearer Token:
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use GuzzleHttp\Client;

class OAuthController extends Controller
{
    public function handleCallback(Request $request)
    {
        // 提取code和scope参数,对应Python的web.input(code=None, scope=None)
        $code = $request->query('code', null);
        $scope = $request->query('scope', null);

        if (is_null($code)) {
            // 处理无code的异常情况
            return response()->json(['error' => 'Authorization code missing'], 400);
        }

        // 使用Guzzle调用接口获取Bearer Token
        $client = new Client();
        try {
            $response = $client->post('https://api.provider.com/oauth/token', [
                'form_params' => [
                    'grant_type' => 'authorization_code',
                    'code' => $code,
                    'redirect_uri' => env('OAUTH_REDIRECT_URI'),
                    'client_id' => env('OAUTH_CLIENT_ID'),
                    'client_secret' => env('OAUTH_CLIENT_SECRET'),
                ]
            ]);

            $tokenData = json_decode($response->getBody(), true);
            $bearerToken = $tokenData['access_token'];

            // 后续逻辑:存储token、跳转页面等
            return response()->json(['access_token' => $bearerToken]);
        } catch (\Exception $e) {
            return response()->json(['error' => $e->getMessage()], 500);
        }
    }
}
  1. 环境变量配置
    在.env文件中添加OAuth相关配置:
OAUTH_REDIRECT_URI=http://redirect_example.com/oauth/
OAUTH_CLIENT_ID=你的客户端ID
OAUTH_CLIENT_SECRET=你的客户端密钥

内容的提问来源于stack exchange,提问作者Emin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 06:45:30