所以我在我的控制器中登录(这里称为facebook)动作,登录回调动作和显示动作,我想使用Facebook API查看信息。我已经了解了我的问题,并且发现我的会话似乎已关闭,但我也读到,在Yii-2中,当应用初始化时,它们会自动开启。我也尝试了没有框架,它运作良好。也许有人在Yii-2中遇到过这样的问题?
登录操作
**public function actionFacebook()**
{
$fb = new Facebook([
'app_id' => 'my_app_id',
'app_secret' => 'my_app_secret',
'default_graph_version' => 'v2.5',
]);
$helper = $fb->getRedirectLoginHelper();
$permissions = ['user_friends']; // optional
$loginUrl = $helper->getLoginUrl('http://myblog.local/site/callback', $permissions);
return $this->render('facebook', [
'loginUrl' => $loginUrl,
]);
}
回调操作
**public function actionCallback()**
{
$fb = new Facebook([
'app_id' => 'my_app_id',
'app_secret' => 'my_app_secret',
'default_graph_version' => 'v2.5',
]);
$helper = $fb->getRedirectLoginHelper();
try {
$accessToken = $helper->getAccessToken();
} catch(FacebookResponseException $e) {
// When Graph returns an error
echo 'Graph returned an error: ' . $e->getMessage();
exit;
} catch(FacebookSDKException $e) {
// When validation fails or other local issues
echo 'Facebook SDK returned an error: ' . $e->getMessage();
exit;
}
if (isset($accessToken)) {
// Logged in!
$_SESSION['facebook_access_token'] = (string) $accessToken;
// Now you can redirect to another page and use the
// access token from $_SESSION['facebook_access_token']
return $this->redirect('/site/display',302);
}
}
显示操作(我想使用Facebook API查看信息)
public function actionDisplay()
{
$fb = new Facebook([
'app_id' => '491899464333863',
'app_secret' => 'f684b9467c548991cc3a91e028163e15',
'default_graph_version' => 'v2.5',
]);
// Sets the default fallback access token so we don't have to pass it to each request
$fb->setDefaultAccessToken($_SESSION['facebook_access_token']);
try {
$response = $fb->get('/me');
$userNode = $response->getGraphUser();
} catch(FacebookResponseException $e) {
// When Graph returns an error
echo 'Graph returned an error: ' . $e->getMessage();
exit;
} catch(FacebookSDKException $e) {
// When validation fails or other local issues
echo 'Facebook SDK returned an error: ' . $e->getMessage();
exit;
}
return $this->render('display', [
'userName' => $userNode,
]);
}
答案 0 :(得分:1)
在Yii2中,如果您之前未使用$S_SESSION
打开会话,则更改session_start()
内容将无效。
通过会话组件访问会话数据时,会话 如果之前没有这样做,将自动打开。这个 与通过$ _SESSION访问会话数据不同 需要显式调用session_start()。
来源:http://www.yiiframework.com/doc-2.0/guide-runtime-sessions-cookies.html
Yii2有一个管理会话的课程。因此,您可以在回调操作中存储 accesToken :
$session = Yii::$app->session;
$session['accessToken'] = $accessToken;
然后,在显示操作中:
$session = Yii::$app->session;
[...]
$fb->setDefaultAccessToken($session['accessToken']);
请记住,您可以使用调试工具栏检查$_SESSION
内容。
更多信息:http://www.yiiframework.com/doc-2.0/yii-web-session.html
答案 1 :(得分:0)
您应该真正设置自己的PersistentDataInterface
。有关详细信息,请参阅此答案:https://stackoverflow.com/a/38116933/1062129