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

寻求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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 18:45:42