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环境下的正确实现
- 定义回调路由
在routes/web.php中添加:
Route::get('/oauth', 'App\Http\Controllers\OAuthController@handleCallback');
- 编写控制器处理回调
创建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); } } }
- 环境变量配置
在.env文件中添加OAuth相关配置:
OAUTH_REDIRECT_URI=http://redirect_example.com/oauth/ OAUTH_CLIENT_ID=你的客户端ID OAUTH_CLIENT_SECRET=你的客户端密钥
内容的提问来源于stack exchange,提问作者Emin
相关产品推荐
相关产品推荐

