它有一些网站,不幸的是所有单独的域名,如:
我已设法使用JSONP / Ajax创建SSO,因此当您登录到其他任何网站时,您也会登录其他网站。
现在我需要实现一个适用于当前SSO的“login with facebook”功能。
这里的问题是Facebook应用程序只能有一个根域可以使用,所以如果你试图在另一个网站上使用Facebook-App,你通常会遇到安全错误。
我尝试了Facebook客户端身份验证,当然,除了我创建Facebook-App之外的任何其他网站都不起作用:
API Error Code: 191
API Error Description: The specified URL is not owned by the application
我还尝试在FB.init中使用当前在所有网站上使用的频道文件:
FB.init({
appId : '1234567890', // app id
channelUrl : 'http://www.domain.de/channel.html', // fqd-path to channel file
status : true, // check login status
cookie : true, // allow the server to access the session
xfbml : true, // parse XFBML
oauth : true // ?
});
现在我正在尝试使用服务器端身份验证,但我仍然不确定是否有更好的方法来解决此问题,因为它迫使我重定向到我在Facebook-App中使用的域。 这里的主要问题是用户流程。
客户流程非常好
虽然服务器流程不是那么流畅
我还想过为每个网站创建一个应用程序;但这只是愚蠢的。
所以,如果有人知道这个问题的更好解决方案,或者有什么需要更多说明,请告诉我。
此致
答案 0 :(得分:1)
最后我不得不创建一个小解决方法。通过为所有登录使用指定的登陆脚本,我能够将用户重定向回到引用页面。
此Facebook链接重定向至http://mydomain.de/fb_connect/1/
https://www.facebook.com/dialog/oauth?client_id=[your_app_id]&redirect_uri=http%3A%2F%2F[your_domain]`%2Ffb_connect%2F[domain_id]%2F&state=[some_hash]&scope=email
[your_app_id] = Facebook App Id
[your_domain] = www.domain.com或您的域名是什么
[domain_id] =我用这个知道用户来自哪里
[some_hash] = Facebook用来阻止xsrf
然后我有一个小PHP脚本准备使用apach mod_rewrite
处理传入的数据.htaccess在我服务器上的fb_connect文件夹中
RewriteEngine On
RewriteRule . index.php [L]
在index.php中,我使用了类似的东西
<?php
/* App-Id / Secret */
$sAppId = '1234567890';
$sAppSecret = 'sdafuh347890oqtgfuasd';
/* Domains and IDs */
$aDomains = array(
'www.domain.de' => 1,
'www.domain-name.de' => 2,
...
);
/* Save a flipped copy */
$aFlip = array_flip($aDomains);
/* Save the request uri */
$sUri = $_SERVER['REQUEST_URI'];
/* Explode the uri; facebook adds everything after the '?' */
$aParts = explode('?', $sUri);
/* Save the first part */
$sUri = $aParts[0];
/* Explode using slash */
$aParts = explode('/', $sUri);
/* This position should be the domain-id */
$iDomainId = $aParts[2];
/* get the domain name */
$sDomain = $aFlip[$iDomainId];
/* If the user authorizes the app this parameter is set */
if (!empty($_GET['code'])) {
/*
* The redirect uri is needed as a security parameter and needs to be EXACTLY
* like in the refereing URI above
*/
$sRedirectUri = 'http://www.domain.de/fb_connect/' . $iDomainId . '/';
/* Get the access token url for the user */
$sTokenUrl = 'https://graph.facebook.com/oauth/access_token?'
. 'client_id=' . $sAppId
. '&client_secret=' . $sAppSecret
. '&redirect_uri=' . urlencode($sRedirectUri)
. '&code=' . $_GET['code'];
/* Use CURL because file_get_contents() can't handle the length of the uri */
$ch = curl_init();
/* Url */
curl_setopt($ch, CURLOPT_URL, $sTokenUrl);
/* Header */
curl_setopt($ch, CURLOPT_HEADER, 0);
/* Return the response instead of echoing it */
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
/* Exec the request */
$sResponse = curl_exec($ch);
/* close CURL */
curl_close($ch);
/* Initialize the Array for the returned data */
$aParams = array();
/* From the Facebook tutorial ;D */
parse_str($sResponse, $aParams);
/* Build the URI to query the opengraph with a user token */
$sGraphUrl =
'https://graph.facebook.com/me?access_token=' . $aParams['access_token'];
/* get, decode and save the returned values */
$aUser = (array)json_decode(file_get_contents($sGraphUrl));
// You should now have the requested userdata and use it to create an account
// or whatever ;D
/* Redirect the user to the refering domain */
header('Location: http://' . $sDomain);
die;
}
/*
* If the user doesn't authorize the app, this parameter is set.
* Do whatever is needed here (logging, crying...) and redirect the user somewhere ;D
*/
if (!empty($_GET['error'])) {
header('Location: http://' . $sDomain);
die;
}
/*
* If the user deletes the app using the control panel in facebook, your script will
* recieve a ping containging this parameter. This is pretty much the same as if
* your app would run inside the facebook canvas.
*/
if (!empty($_POST['signed_request'])) {
// Decode the signed request using the facebook tutorial methods, and delete
// the user from your system :D
}
?>
这对我来说非常有用。如果您有任何问题,请随时提出。
此致