寻求Laravel Passport客户端使用示例及对接Etsy OAuth2方案
Laravel Passport对接第三方OAuth2(Etsy v3)实操示例
以下是基于Laravel Passport对接Etsy OAuth2 API v3的完整流程示例,覆盖PKCE挑战、授权码换取令牌及刷新令牌的核心步骤:
1. 配置第三方服务信息
在config/services.php中添加Etsy的OAuth配置:
'etsy' => [ 'client_id' => env('ETSY_CLIENT_ID'), 'client_secret' => env('ETSY_CLIENT_SECRET'), 'redirect' => env('ETSY_REDIRECT_URI'), 'url_authorize' => 'https://www.etsy.com/oauth/connect', 'url_token' => 'https://api.etsy.com/v3/public/oauth/token', 'scopes' => ['listings_r', 'transactions_r'], // 根据业务需求调整权限 ],
同时在.env文件中补充对应的环境变量:
ETSY_CLIENT_ID=你的Etsy客户端ID ETSY_CLIENT_SECRET=你的Etsy客户端密钥 ETSY_REDIRECT_URI=https://your-domain.com/etsy/callback
2. 生成PKCE挑战(Etsy强制要求)
利用Laravel Passport内置的PKCE工具类生成验证所需的code_verifier和code_challenge:
use Laravel\Passport\PKCE; use Illuminate\Support\Facades\Session; // 生成随机的code_verifier $codeVerifier = PKCE::generateCodeVerifier(); // 基于S256方法生成code_challenge $codeChallenge = PKCE::generateCodeChallenge($codeVerifier); // 将code_verifier存入Session,回调时需要使用 Session::put('etsy_code_verifier', $codeVerifier);
3. 构建并跳转至Etsy授权页面
通过Passport的Client实例构建符合Etsy要求的授权URL,引导用户完成授权:
use Laravel\Passport\Client; use Illuminate\Support\Facades\Redirect; // 获取你之前通过Artisan创建的Etsy对接客户端 $client = Client::where('name', 'Etsy OAuth Client')->first(); // 构建授权URL $authorizeUrl = $client->getAuthorizationUrl( [ 'scope' => implode(' ', config('services.etsy.scopes')), 'code_challenge' => $codeChallenge, 'code_challenge_method' => 'S256', ], config('services.etsy.url_authorize') ); // 跳转至Etsy授权页面 return Redirect::to($authorizeUrl);
4. 回调处理:用授权码换取访问令牌
在回调路由中,使用授权码结合之前存储的code_verifier向Etsy请求令牌,并存储到你的令牌模型中:
use Illuminate\Http\Request; use Laravel\Passport\Client; use Illuminate\Support\Facades\Session; Route::get('/etsy/callback', function (Request $request) { $client = Client::where('name', 'Etsy OAuth Client')->first(); $codeVerifier = Session::get('etsy_code_verifier'); // 向Etsy请求令牌 $response = $client->getAccessToken( 'authorization_code', [ 'code' => $request->code, 'code_verifier' => $codeVerifier, 'redirect_uri' => config('services.etsy.redirect'), ], config('services.etsy.url_token') ); // 解析令牌响应数据 $tokenData = json_decode($response->getBody(), true); // 将令牌存储到你的自定义模型(示例关联到当前用户) auth()->user()->etsyTokens()->create([ 'access_token' => $tokenData['access_token'], 'refresh_token' => $tokenData['refresh_token'], 'expires_at' => now()->addSeconds($tokenData['expires_in']), ]); // 跳转回应用内页面 return redirect('/dashboard'); });
5. 使用刷新令牌获取新的访问令牌
当访问令牌过期时,通过刷新令牌向Etsy请求新的令牌:
use Laravel\Passport\Client; // 获取用户最新的Etsy令牌记录 $tokenRecord = auth()->user()->etsyTokens()->latest()->first(); $client = Client::where('name', 'Etsy OAuth Client')->first(); // 请求新的令牌 $response = $client->getAccessToken( 'refresh_token', [ 'refresh_token' => $tokenRecord->refresh_token, ], config('services.etsy.url_token') ); $newTokenData = json_decode($response->getBody(), true); // 更新令牌记录 $tokenRecord->update([ 'access_token' => $newTokenData['access_token'], 'refresh_token' => $newTokenData['refresh_token'] ?? $tokenRecord->refresh_token, 'expires_at' => now()->addSeconds($newTokenData['expires_in']), ]);
关键注意事项
- 确保你创建的Passport客户端类型为第三方客户端(执行
php artisan passport:client时选择"client credentials"类型,或确认客户端的password_client字段为false)。 - 所有请求必须严格遵循Etsy OAuth2 v3的文档要求,比如权限范围的格式、回调URL的一致性。
内容的提问来源于stack exchange,提问作者Scott
相关产品推荐
相关产品推荐

