0

I'm using Laravel 9 Passport. On the front-end after a user signs into a social account, I"m passing the provider info to the Auth issueToken method. I'd like to return if a new account was created in Laravel (in contrast to if an account already existed).

In Laravel, my issueToken method looks like this:

 public function issueToken(ServerRequestInterface $request)
    {
        try {

            return $this->server->respondToAccessTokenRequest($request, new Psr7Response);

        } catch (ClientException $exception) {

            //never gets here! code below is meaningless.
            $error = json_decode($exception->getResponse()->getBody());
            throw OAuthServerException::invalidRequest('access_token', object_get($error, 'error.message'));
        }

I have a SocialUserRevolver Model that overrides the resolveUserByProviderCredentials method. Here a createOrGetUser method is called, where a new user record is created, or an existing account is retrieved.

class SocialUserResolver implements SocialUserResolverInterface
{

    /**
     * Resolve user by provider credentials.
     *
     * @param string $provider
     * @param string $accessToken
     *
     * @return Authenticatable|null
     * @throws Exception
     */

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

        try {
            $providerUser = Socialite::driver($provider)->stateless()->userFromToken($accessToken);

        } catch (Exception $exception) {
            //Log::info('exception: '.$exception->getMessage());
            //throw new Exception($exception->getMessage());
        }

            //if (! $providerUser->getEmail())
            //    throw new Exception('Email address not allowed');

        if ($providerUser) {
            return (new ProviderAccountService())->createOrGetUser($providerUser, $provider);
        }

        return null;
    }
}

I'd like to find a good way to return a new field like "account_created", so the front-end can determine if this was a new account.

1 Answer 1

0

This is how I solved this problem:

In the createOrGetUser() method, if a new user was created I added a session variable:

session(['user_created' => true]);

Then instead of just returning the default response, I intercept the response, and then create a new response adding in the user_created field from the session data:

            $response = $this->server->respondToAccessTokenRequest($request, new Psr7Response);

            $bodyContents = json_decode((string) $response->getBody(), true);

            //add user_created field to body contents
            $bodyContents['user_created'] = false;
            if ($requestParams and $requestParams['grant_type'] === 'social')
                $bodyContents['user_created'] = session('user_created');

            return response()
                ->json($bodyContents, $response->getStatusCode());
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.