facebook登录 在 php 框架 slim里的实现

首先使用composer 安装 facebook的php SDK
composer require facebook/graph-sdk

使用了Slim框架,登录也是调用的接口,总共定义了两个链接(或者路由)facebookLoginfacebookCallback . 一个入口链接:负责处理跳转到facebook登录并跳回的功能。另一个是处理回调的:获取facebook的用户基本信息并登录。

facebookLogin

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
function facebookLogin(Request $request,Response $response)
{
$appid='1213187855410344';
$fb = new \Facebook\Facebook([
'app_id' => $appid,
'app_secret' => '8b1151cfa1958249297e6e061e771207',
'default_graph_version' => 'v2.8',
]);
$helper = $fb->getRedirectLoginHelper();
$permissions = ['email']; // Optional permissions
$loginUrl = $helper->getLoginUrl('http://www.product.win/fb-callback', $permissions);
return $response->withRedirect($loginUrl);
}
function facebookCallback(Request $request, Response $slimresponse)
{
$utils=new Utils($this->guzzle,$this->id_token,$this->logger,$this->lg);
$appid='1213187855410344';
$fb = new \Facebook\Facebook([
'app_id' => $appid,
'app_secret' => '8b1151cfa1958249297e6e061e771207',
'default_graph_version' => 'v2.8',
]);
$helper = $fb->getRedirectLoginHelper();
try {
$accessToken = $helper->getAccessToken();
} catch(Facebook\Exceptions\FacebookResponseException $e) {
// When Graph returns an error
echo 'Graph returned an error: ' . $e->getMessage();
exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
// When validation fails or other local issues
echo 'Facebook SDK returned an error: ' . $e->getMessage();
exit;
}
if (! isset($accessToken)) {
if ($helper->getError()) {
header('HTTP/1.0 401 Unauthorized');
echo "Error: " . $helper->getError() . "\n";
echo "Error Code: " . $helper->getErrorCode() . "\n";
echo "Error Reason: " . $helper->getErrorReason() . "\n";
echo "Error Description: " . $helper->getErrorDescription() . "\n";
} else {
header('HTTP/1.0 400 Bad Request');
echo 'Bad request';
}
exit;
}
//上面为处理跳转授权之类的代码 下面是获取用户信息 根据传递的字段 获取...
try {
// Get the \Facebook\GraphNodes\GraphUser object for the current user.
// If you provided a 'default_access_token', the '{access-token}' is optional.
$response = $fb->get('/me?fields=id,name,email,picture,gender',$accessToken);
} catch(\Facebook\Exceptions\FacebookResponseException $e) {
// When Graph returns an error
echo 'Graph returned an error: ' . $e->getMessage();
exit;
} catch(\Facebook\Exceptions\FacebookSDKException $e) {
// When validation fails or other local issues
echo 'Facebook SDK returned an error: ' . $e->getMessage();
exit;
}
$me = $response->getGraphUser();//facebook/src/Facebook/GraphNodes/GraphUser.php 类文件
if($me->getEmail()){//手机注册的可能没有email账号...
$postData=[
'appid'=>$appid,
'email'=>$me->getEmail(),
'gender'=>$me->getGender(),
'name'=>$me->getName(),
'os'=>$utils->getOS(),//utils文件新增获取操作系统的功能
'picture'=>$me->getPicture()->getUrl(),//facebook/src/Facebook/GraphNodes/GraphPicture.php 类文件
'rememberMe'=>true,
'token'=>$accessToken->getValue(),
'userid'=>$me->getId()
];
//调用facebook接口登录
$ret=$utils->faceBookLogin(['json'=>$postData]);
if(isset($ret['id_token'])){
setcookie("id_token","Bearer ".$ret['id_token'],time()+3600*24,'/');
setcookie("fb_user",json_encode($ret),time()+3600*24,'/'); //保存接口返回的信息
return $slimresponse->withRedirect('/'); //$slimresponse 避免和 facebook的$response 重名
}
}else{
//手机注册的可能没有email账号...
die('the Facebook account doesn\'t have the email address...');
}
}