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
相关产品推荐
相关产品推荐

