簡體   English   中英

Facebook Socialite 從令牌和秘密中獲取用戶

[英]Facebook Socialite get user from token and secret

在 laravel 文檔中有一部分是關於讓用戶使用->userFromTokenAndSecret但是它似乎不適用於 facebook 並返回此方法不存在的錯誤。

如何通過令牌和秘密獲取用戶?

我使用 Laravel 作為 API,因此它可以無狀態地工作,並且我不使用任何重定向。
我使用 Angular 應用程序登錄,然后發送令牌。 我需要處理那個。

我找到了我的問題的答案,它是userFromToken 想法是什么:

1) 我使用ngx-social-login在 Angular 6 上授權我的用戶

2) 我從 Facebook 收到用戶數據

3)我將authToken發送到 API

4) 我在后端 API 上使用Socialite::driver('facebook')->stateless()->userFromToken($token)從 Facebook 接收用戶數據

5)做任何我想做的事。 在我的情況下,我將數據保存到數據庫或檢索用戶(如果存在),然后使用 JWT 為該用戶創建一個令牌並返回它

我也有問題,但不是 facebook。 我在這個插件中使用 twitter api。

https://github.com/thujohn/twitter

我從 Twitter 插件獲取令牌后使用社交名流。

這是我試圖獲取令牌的完整內容。

<?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 = Socialite::driver('twitter')->userFromTokenAndSecret($token['oauth_token'], $token['oauth_token_secret']);

所以使用 $user 我可以在那里獲得電子郵件和另一個屬性。

我有一個解決方法來避免方法不存在“錯誤”

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM