我正试图在我的web应用程序中使用php-sdk实现facebook登录,但它不起作用。出于某种原因,在用户从facebook页面返回以获得应用程序访问用户信息的权限后,$_SESSION["FBRLH_state"]的值似乎已被修改。
以下是我正在使用的代码:
facebookloginbutton.php
<?php
session_start();
require_once 'facebook/facebook-php-sdk-v4-5.0.0/src/Facebook/autoload.php';
$fb = new Facebook'Facebook([
'app_id' => '*****',
'app_secret' => '*****',
'default_graph_version' => 'v2.5',
]);
$helper=$fb->getRedirectLoginHelper();
$permissions=['public_profile']; // Optional permissions
$loginUrl=$helper->getLoginUrl('mydomain.com/snslogin/fb-callback', $permissions);
//output the FBRLH_state here (name this state1)
echo $_SESSION["FBRLH_state"];
?>
<a href="<?php echo htmlspecialchars($loginUrl); ?>">facebook login</a>
fb-callback.php(仅顶部)
<?php
session_start();
require_once 'facebook/facebook-php-sdk-v4-5.0.0/src/Facebook/autoload.php';
//output $_SESSION["FBRLH_state"] (name this state2)
var_dump($_SESSION);
//output the state variable in the URL (name this state3)
echo '<br>'.$_GET["state"].'<br>';
在上面的代码中,我得到了状态1和状态3的相同值,但由于某些原因,状态2不同。由于这些值不同,程序不会继续执行fb-callback.php的其余代码。
我在另一个网络应用程序中用facebook帐户进行了php登录,所以我以为我知道自己在做什么,但我就是找不到我犯的错误。
我认为这些设置不允许跨站点会话共享之类的。
public function index()
{
$fbConfig = config('Facebook');
$fb = new FacebookLogin([
'app_id' => $fbConfig->appID,
'app_secret' => $fbConfig->appSecret,
]);
$helper = $fb->getRedirectLoginHelper();
$permissions = ['email', 'public_profile', 'user_friends'];
if(!$this->session->has('fb_access_token'))
{
$accessToken = $helper->getAccessToken();
if($accessToken)
{
$this->session->set('fb_access_token', $accessToken);
}
}
else
{
$accessToken = $this->session->get('fb_access_token');
}
$loginUrl = $helper->getLoginUrl(base_url(route_to('facebook/callback')), $permissions);
return redirect()->to($loginUrl);
}
public function callback()
{
$usersModel = new UsersModel();
$fbConfig = config('Facebook');
$fb = new FacebookLogin([
'app_id' => $fbConfig->appID,
'app_secret' => $fbConfig->appSecret,
]);
$getResponse = $this->request->getGet(NULL);
if(isset($getResponse['state']))
{
$this->ViewData['Metas'] = $this->getMetas($this->metaSeo['success']);
$helper = $fb->getRedirectLoginHelper();
if(!$this->session->has('fb_access_token'))
{
$accessToken = $helper->getAccessToken();
$this->session->set('fb_access_token', $accessToken);
}
else
{
$accessToken = $this->session->get('fb_access_token');
}
$response = $fb->get('/me?fields=id,name,email,location', $accessToken);
$user = $response->getGraphUser();
if($user->getEmail())
{
$UserFound = $usersModel->where('email', $user->getEmail())->first();
if($UserFound)
{
$this->session->set('user', $UserFound->id_user);
$UserFound->setLastLogin();
$usersModel->save($UserFound);
return redirect()->to('account');
}
}
else
{
// email is required to acceess account
}
$this->ViewData['LayoutView'] = 'Facebook/Success';
}
else
{
$this->ViewData['LayoutView'] = 'Facebook/Errors';
if($getResponse['error_reason'] == 'user_denied')
{
}
}
return view('MasterPages/Master', $this->ViewData);
}