在laravel文档中,有一部分内容涉及如何使用户无法使用->userFromTokenAndSecret
,但它似乎无法与Facebook一起使用,并返回此方法不存在的错误。
如何通过令牌和机密获取用户?
我正在使用Laravel作为API,因此它可以无状态运行,并且不使用任何重定向。
我使用Angular应用程序登录并发送令牌。我需要处理。
答案 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
2)我收到来自Facebook的用户数据
3)我将authToken
发送到API
4)我使用Socialite::driver('facebook')->stateless()->userFromToken($token)
5)做任何我想做的事。就我而言,我将数据保存到数据库或检索用户(如果存在),然后使用JWT为该用户创建令牌并返回
答案 2 :(得分:0)
我有一个解决方法来避免方法不存在“错误”
$user = call_user_func(array(Socialite::driver("facebook"),"userFromToken"),$token);