在Socialite文档中,它表示以下行获取用户信息:
$user = Socialite::driver('twitter')->user();
这自然地假设回调来自Twitter。但是,在某些情况下,无意中请求了回调路由,上面的行给出了如下错误:
InvalidArgumentException in TwitterProvider.php line 15:
Invalid request. Missing OAuth verifier.
如何在执行上述行之前检测到回调是从预期的地方(这里是Twitter)发起的?我的日志文件中包含这些错误消息。我认为这些错误来自搜索引擎机器人请求回调路由(Auth机制似乎正常工作)。
答案 0 :(得分:1)
这里有两个解决方案,一个正是你要求的(如果我没有误解你的问题),还有一个能够解决错误。
您尝试解决的问题似乎是阻止用户在您的控制器中打开回调方法,以验证呼叫的引荐来源。如果这是您要实现的目标,则可以继续使用
检索HTTP Referrer$referrer = Request::server('HTTP_REFERER');
解析$ referrer并查看它是否符合您的需求(ex github.com)
$host = parse_url($referrer, PHP_URL_HOST);
if(strpos($host, 'github.com') !== false) {
// your code here
}
所以,完整的方法可能是这样的
public function callback()
{
$referrer = Request::server('HTTP_REFERER');
if($referrer) {
$host = parse_url($referrer, PHP_URL_HOST);
if(strpos($host, 'github.com') !== false) {
$user = Socialite::driver('github')->user();
// your code here
}
}
}
摆脱错误的另一种方法,可能是更好的选择是将代码保存在try / catch块中,如下所示
public function callback()
{
try {
$user = Socialite::driver('github')->user();
} catch (InvalidArgumentException $e) {
// what will you do if the token is not set?
}
}
答案 1 :(得分:1)
使用Twitter时,Twitter处理的重定向网址会发送两个查询参数 oauth_token 和 oauth_verifier 。
因此,您可以添加路由验证以检查URL是否包含参数。
在控制器中添加验证
public function yourcallbackfunction()
{
$v = \Validator::make(request()->all(), [
'oauth_token' => 'required',
'oauth_verifier' => 'required'
];
if($v->fails()) {
//do something as it's not a valid twitter callback
}else {
$user = Socialite::driver('twitter')->user();
}
}
最好在try catch中处理socialite调用,以捕获社交网站可能抛出的其他错误,例如api上的无效令牌错误或通信错误。
答案 2 :(得分:0)
我认为它应该捕获一般错误。
try {
$user = Socialite::driver('twitter')->user();
} catch (\Exception $e) {
# do something if nothing works
}
答案 3 :(得分:-1)
$socialAccount = Socialite::driver('github')->user();
如果您需要当前经过身份验证的用户的帐户详细信息,请使用相同的旧
$user = Auth::user();
答案 4 :(得分:-1)
我真的不太了解你的问题。但我想你想获得提供者名称。
路由应提供提供商的名称(github,facebook,google)
Route::get('/redirect/{provider}', [
'as' => 'getSocialAuthRedirect',
'uses' => 'Auth\SocialAuthController@redirect'
]);
Route::get('/callback/{provider}', [
'as' => 'getSocialAuthCallback',
'uses' => 'Auth\SocialAuthController@callback'
]);
在控制器中,您可以获得提供者名称
public function callback($provider)
{
// get provider and do something
}
如果你想从github检测回调,只需要检查$provider == 'GithubProvider'
希望有所帮助!