【问题标题】:Call to undefined method Laravel\Socialite\One\TwitterProvider::stateless()调用未定义的方法 Laravel\Socialite\One\TwitterProvider::stateless()
【发布时间】:2016-05-26 19:42:10
【问题描述】:

我收到以下错误:

Call to undefined method Laravel\Socialite\One\TwitterProvider::stateless()

抛出此错误的行是:

$userData = Socialite::driver($provider)->stateless()->user();

以上方法适用于 Facebook 登录。

有什么想法吗?

【问题讨论】:

    标签: php laravel twitter-oauth laravel-5.2 laravel-socialite


    【解决方案1】:

    快速浏览一下,TwitterProvider 使用的 AbstractProvider 与 FacebookProvider 不同。

    TwitterProvider 的 AbstractProvider 没有实现 stateless()。

    所以我想我要说的是......开箱即用的 Laravel Socialite 包中的 TwitterProvider 无法实现无状态 oAuth。

    【讨论】:

      【解决方案2】:

      TwitterProvider 需要 secret 带有令牌,您可以使用此方法

      userFromTokenAndSecret

      例子

      $user = Socialite::driver('twitter')->userFromTokenAndSecret($token, $secret);
      

      【讨论】:

      • @Bdwey @Husam 你从哪里得到 $token,和 .env 文件中的 TWITTER_CLIENT_ID 一样吗?
      • @kp123 用户在 iOS、Android 或任何其他平台上成功登录 Twitter 后,Twitter 将返回一个令牌。将此令牌发送到您的后端并使用此代码获取和验证用户信息
      • @Husam 谢谢,但我很困惑..我们不是要让用户登录吗?
      • @Husam 例如我有$redirectUrl = Socialite::driver($service)->stateless()->user()->redirect(); 我试图首先获取重定向 URL ...但显然 stateless() 不起作用,所以我试图找出一个完成这项工作的方法
      • @kp123 我们仅在开发 API 以验证成功的用户登录请求时才使用“无状态”。如果您想登录网络,我建议您使用无状态。
      【解决方案3】:

      在你的 loginController 中,在 handleProviderCallback 函数中替换:

      $userSocial = Socialite::driver($social)->stateless()->user();
      

      与:

      $userSocial = Socialite::driver($social)->user();
      

      使用:

      "laravel/socialite": "^3.0"
      

      在您的 composer.json 要求部分中。

      【讨论】:

      • 不会工作。因为一个是无状态的,一个是有状态的。
      【解决方案4】:

      您无法使用 stateless 从 Twitter 获取用户信息,因为在我撰写本文时,Twitter 不支持 OAuth 2.0。 Link to twitter dev forum 但是,我找到了使用 API 登录的解决方法。

      但是,一种方法是使用此重定向

      return Socialite::driver('twitter')->redirect();
      

      在您的回调中,使用 this 获取返回的信息

      Socialite::driver($provider)->user();
      

      从这里获取您希望的令牌和其他信息,然后,执行您的操作并将凭据存储在数据库中,并获取新的数据库行 ID 并加密该值并使用该加密值重定向到您的登录页面。在您的登录页面中,执行一些操作并检查是否存在类似的 id,如果存在,则尝试登录。现在在loginController,执行类似的操作

                  $authId = $request->get('authId');
                  $authId = decrypt($authId);
                  $social = SocialAuth::find($authId);
                  $user = User::find($social->user_id);
      

      然后尝试使用 id 登录该用户。使用更多参数重定向到登录 url,以提高安全性。 我希望你明白这个概念。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-07
        • 2016-04-20
        • 2013-10-23
        • 1970-01-01
        • 2015-05-31
        • 2016-06-05
        • 2016-09-03
        • 2015-06-10
        相关资源
        最近更新 更多