Facebook Socialite从令牌和秘密中获取用户

时间:2018-09-05 21:56:31

标签: php laravel facebook laravel-socialite dingo-api

在laravel文档中,有一部分内容涉及如何使用户无法使用->userFromTokenAndSecret,但它似乎无法与Facebook一起使用,并返回此方法不存在的错误。

如何通过令牌和机密获取用户?

我正在使用Laravel作为API,因此它可以无状态运行,并且不使用任何重定向。
我使用Angular应用程序登录并发送令牌。我需要处理。

3 个答案:

答案 0 :(得分:1)

我也遇到了问题,但没有Facebook。我在这个插件上使用了twitter api。

https://github.com/thujohn/twitter

从Twitter插件获取令牌后,我会使用社交名媛。

这是我试图获取令牌的全部信息。

type SimpleContextHandler func(w http.ResponseWriter, r *http.Request)

func (fn SimpleContextHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    ctx := context.WithValue(context.Background(), "Foo", "bar")
    fn(w, r.WithContext(ctx))
}

func passContextHandler(w http.ResponseWriter, r *http.Request) {
    bar := r.Context().Value("Foo").(string)
    w.Write([]byte(bar))
}

也许可以帮助您。

点代码在这里

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Log;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Session;
use App\Repositories\UserRepository;
use Twitter;
use Redirect;
use Hash;
use App\User;
use Socialite;
use Auth;

class SocialController extends Controller
{
    function login() {
        // your SIGN IN WITH TWITTER  button should point to this route
        $sign_in_twitter = true;
        $force_login = false;

        // Make sure we make this request w/o tokens, overwrite the default values in case of login.
        Twitter::reconfig(['token' => '', 'secret' => '']);
        $token = Twitter::getRequestToken(route('twitter.callback'));

        if (isset($token['oauth_token_secret']))
        {
            $url = Twitter::getAuthorizeURL($token, $sign_in_twitter, $force_login);

            Session::put('oauth_state', 'start');
            Session::put('oauth_request_token', $token['oauth_token']);
            Session::put('oauth_request_token_secret', $token['oauth_token_secret']);

            return Redirect::to($url);
        }

        return Redirect::route('twitter.error');
    }

    function callback() {
        Log::info('callbackk call');
        // You should set this route on your Twitter Application settings as the callback
        // https://apps.twitter.com/app/YOUR-APP-ID/settings
        if (Session::has('oauth_request_token'))
        {
            $request_token = [
                'token'  => Session::get('oauth_request_token'),
                'secret' => Session::get('oauth_request_token_secret'),
            ];

            Twitter::reconfig($request_token);

            $oauth_verifier = false;

            if (Input::has('oauth_verifier'))
            {
                $oauth_verifier = Input::get('oauth_verifier');
                // getAccessToken() will reset the token for you
                $token = Twitter::getAccessToken($oauth_verifier);
                Log::info('token created: ' . print_r($token,true));
            }

            if (!isset($token['oauth_token_secret']))
            {
                Log::info('oauth_token_secret fail');
                return Redirect::route('twitter.error')->with('flash_error', 'We could not log you in on Twitter.');
            }

            $credentials = Twitter::getCredentials([
                'include_email' => 'true',
            ]);

            if (is_object($credentials) && !isset($credentials->error))
            {
                // $credentials contains the Twitter user object with all the info about the user.
                // Add here your own user logic, store profiles, create new users on your tables...you name it!
                // Typically you'll want to store at least, user id, name and access tokens
                // if you want to be able to call the API on behalf of your users.

                // This is also the moment to log in your users if you're using Laravel's Auth class
                // Auth::login($user) should do the trick.

                Session::put('access_token', $token);
                Log::info('access_token: ' . print_r($token,true));

                $users = Twitter::getUsers([
                    'user_id'=>$token['user_id']
                ]);

                Log::info('users: ' . print_r($users,true));
                if(count($users) > 0) {

                    // pakai socialite untuk mengambil email
                    $user = Socialite::driver('twitter')->userFromTokenAndSecret($token['oauth_token'], $token['oauth_token_secret']);
                    $user_email = $user->getEmail();
                    $user_name = $user->getName();

                    if($user_email) {
                        $this->_set_login($user_name, $user_email);
                        Log::info("email sets");
                    } else {
                        Log::info("email not sets and go with id provider");
                    }

                } else {
                    Log::info("users not found");
                }

                return Redirect::to('/')->with('flash_notice', 'Congrats! You\'ve successfully signed in!');
            }

            Log::info('twitter.error');
            return Redirect::route('twitter.error')->with('flash_error', 'Crab! Something went wrong while signing you up!');
        }

        Log::info('end callbackk call');
    }

    private function _set_login($user_name, $user_email) {
        $UserRepository = new UserRepository;
        $data_user = $UserRepository->getByEmail($user_email);
        if(count($data_user) > 0) {
            // sudah terdaftar
            $user_id = $data_user->id;
        } else {
            // belum terdaftar dan jalankan proses register
            $data_save = [
                'name' => $user_name,
                'email' => $user_email,
                'password' => Hash::make($user_email)
            ];

            $user_id = $UserRepository->save_data($data_save);
        }

        $user = User::find($user_id);
        Auth::login($user);
    }
}

因此,使用$ user,我可以在那里获取电子邮件和其他属性。

答案 1 :(得分:0)

我已经找到问题的答案,它是userFromToken。有什么想法:

1)我使用ngx-social-login

授权我的用户使用Angular 6

2)我收到来自Facebook的用户数据

3)我将authToken发送到API

4)我使用Socialite::driver('facebook')->stateless()->userFromToken($token)

通过后端API从Facebook接收用户数据

5)做任何我想做的事。就我而言,我将数据保存到数据库或检索用户(如果存在),然后使用JWT为该用户创建令牌并返回

答案 2 :(得分:0)

我有一个解决方法来避免方法不存在“错误”

$user = call_user_func(array(Socialite::driver("facebook"),"userFromToken"),$token);