[英]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.