Laravel 使用 Socialite(google、facebook 等)登录并创建我自己的应用程序的访问令牌

Posted

技术标签:

【中文标题】Laravel 使用 Socialite(google、facebook 等)登录并创建我自己的应用程序的访问令牌【英文标题】:Laravel login with Socialite (google, facebook, etc) and create an access token of my own app 【发布时间】:2019-06-03 18:36:50 【问题描述】:

我正在使用 Laravel 社交身份验证和 Socialite,我可以成功登录,但我想创建自己的应用程序的访问令牌,而不是 google、twitter 和 facebook 令牌。

我可以创建访问令牌,但每次用户使用 Socialite 登录时都会创建访问令牌。我想要的是在用户首次使用社交名流登录时创建令牌。此外,创建令牌时缺少“user_id”。

这是我的登录控制器

   public function handleProviderCallback($provider)
   
       try 
           $user = Socialite::driver($provider)->stateless()->user();
        catch (Exception $e) 
           return redirect('/login');
      
       $authUser = $this->findOrCreateUser($user, $provider);

        Auth::login($authUser,false);

        $user = User::find($authUser['user_id']);

        return $this->getBearerTokenByUser($user, 3, true);
   //    return redirect($this->redirectTo);
      return $user;
  


   public function findOrCreateUser($providerUser, $provider)
   
       $account = SocialProvider::whereProviderName($provider)
                  ->whereProviderId($providerUser->getId())
                  ->first();

       if ($account) 
          return $account->user;
        else 
           $user = User::whereEmail($providerUser->getEmail())->first();

           if (! $user) 
               $user = User::firstOrCreate([
                   'email' => $providerUser->getEmail(),
                   'first_name'  => $providerUser->getName(),

               ]);
           

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

这里是数据库数据table 'oauth_access_tokens' table 'users_key'

user_id 丢失,并且为同一个人创建了两次令牌(使用 google 登录)。

用户没有密码,因为它通过社交名流进行身份验证。

【问题讨论】:

【参考方案1】:

你可能想做一些类似的事情

// Retrieve user by email, or create it with the email and first_name attributes...

User::firstOrCreate(
  ['email' => $providerUser->getEmail()],
  ['first_name'  => $providerUser->getName()]
]);

【讨论】:

是的,我可以通过检索他们的电子邮件或其他方式创建一个新用户,但我想做的是创建一个新用户并为这个新用户生成我的应用程序的访问令牌。 您的电子邮件地址字段在数据库中设置为唯一吗? 酷。这意味着由于数据库限制,您将无法使用相同的电子邮件地址创建第二条记录。 是的,在 'user' 表中,它只创建一次,但在 'oauth_access_tokens' 表中,它每次登录时都会创建......这就是问题所在,我想要一个用户的一个令牌。 因此,您可能需要更新已保存用户的现有关系 $user->socialProviders()->update([ 'provider_id' => $providerUser->getId(),provider_name' => $provider]);,而不是 User::firstOrCreate

以上是关于Laravel 使用 Socialite(google、facebook 等)登录并创建我自己的应用程序的访问令牌的主要内容,如果未能解决你的问题,请参考以下文章

找不到类“Laravel\Socialite\SocialiteServiceProvider”

Laravel 7 Socialite Google 登录显示无效的授权错误

Laravel 使用 Socialite(google、facebook 等)登录并创建我自己的应用程序的访问令牌

在没有会话的情况下使用 laravel socialite 和 jwt-auth

将 Laravel Socialite 与 API 一起使用?

用户取消应用请求后,Laravel 5 Socialite Facebook 登录错误处理回调