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

Laravel 9 Passport返回Token时如何标识是否创建新用户?

在Laravel 9 Passport社交登录中返回账号创建状态

1. 修改createOrGetUser方法返回账号创建状态

先调整ProviderAccountService类的createOrGetUser方法,让它同时返回用户实例和是否为新账号的标识:

class ProviderAccountService
{
    public function createOrGetUser($providerUser, $provider)
    {
        $account = ProviderAccount::where('provider_name', $provider)
            ->where('provider_id', $providerUser->getId())
            ->first();

        if ($account) {
            return [
                'user' => $account->user,
                'account_created' => false
            ];
        }

        $user = User::updateOrCreate(
            ['email' => $providerUser->getEmail()],
            ['name' => $providerUser->getName()]
        );

        $user->providerAccounts()->create([
            'provider_name' => $provider,
            'provider_id' => $providerUser->getId(),
        ]);

        return [
            'user' => $user,
            'account_created' => true
        ];
    }
}

2. 在SocialUserResolver中传递账号创建状态

修改SocialUserResolver的方法,将账号创建状态存入请求属性,方便后续在issueToken中获取:

use Illuminate\Http\Request;

class SocialUserResolver implements SocialUserResolverInterface
{
    protected $request;

    public function __construct(Request $request)
    {
        $this->request = $request;
    }

    public function resolveUserByProviderCredentials(string $provider, string $accessToken): ?Authenticatable
    {
        $providerUser = null;

        try {
            $providerUser = Socialite::driver($provider)->stateless()->userFromToken($accessToken);
        } catch (Exception $exception) {
            // 可添加日志记录逻辑
        }

        if ($providerUser) {
            $result = (new ProviderAccountService())->createOrGetUser($providerUser, $provider);
            
            $this->request->attributes->add(['account_created' => $result['account_created']]);
            
            return $result['user'];
        }

        return null;
    }
}

3. 修改issueToken方法添加状态字段

最后调整issueToken方法,解析Passport的响应并加入自定义字段后返回:

public function issueToken(ServerRequestInterface $request)
{
    try {
        $response = $this->server->respondToAccessTokenRequest($request, new Psr7Response);
        
        $accountCreated = app('request')->attributes->get('account_created', false);
        
        $responseData = json_decode($response->getBody()->getContents(), true);
        $responseData['account_created'] = $accountCreated;
        
        $newResponse = new Psr7Response();
        $newResponse->getBody()->write(json_encode($responseData));
        
        foreach ($response->getHeaders() as $headerName => $headerValues) {
            $newResponse = $newResponse->withHeader($headerName, $headerValues);
        }
        
        return $newResponse;

    } catch (ClientException $exception) {
        $error = json_decode($exception->getResponse()->getBody());
        throw OAuthServerException::invalidRequest('access_token', object_get($error, 'error.message'));
    }
}

完成以上修改后,前端调用issueToken接口时,响应结果会包含account_created字段:值为true表示是新创建的账号,false表示是已有账号。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 12:50:11