0

現在、SSO Web サイト ネットワークを開発しています。

残念ながら、次のようなすべて別のドメインであるいくつかのWebサイトがあります。

  • domain.de
  • domain-specials.de
  • domain-otherthings.de
  • somethingelse.de

JSONP / Ajax を使用してSSOを作成できたので、いずれかのサイトにログインすると、他のサイトにもサインオンされます。

現在の SSO で動作する「 facebook でログイン」機能を実装する必要があります。

ここでの問題は、Facebook アプリが動作するルート ドメインを 1 つしか持てないことです。そのため、別の Web サイトで Facebook アプリを使用しようとすると、ほとんどの場合、セキュリティ エラーが発生します。

Facebook クライアント側認証を試してみましたが、これはもちろん、Facebook アプリを作成したサイト以外のサイトでは機能しません。

API Error Code: 191
API Error Description: The specified URL is not owned by the application

また、現在すべての Web サイトで使用されている 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 アプリで使用したドメインにリダイレクトする必要があるため、この問題を解決するためのより良い方法がないかどうかはまだわかりません。ここでの主な問題は、ユーザー フローです。

クライアントフローはかなりいいです

  1. Facebookでログインをクリック
  2. Facebookポップアップ
  3. はいまたはいいえをクリックします
  4. 終わり!

サーバーフローはそれほど流動的ではありませんが、

  1. Facebookでログインをクリック
  2. Facebookにリダイレクト
  3. はいまたはいいえをクリックします
  4. ルート ドメインにリダイレクト
  5. どういうわけか元のドメインにリダイレクト
  6. 終わり!

また、サイトごとにアプリを作成することも考えました。しかし、それはただのばかです。

したがって、この問題のより良い解決策を知っている人や、さらに明確にする必要がある場合は、私に知らせてください。

よろしく

4

1 に答える 1

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 アプリ ID
[your_domain] = www.domain.com またはドメイン名
[domain_id] = ユーザーがどこから来たかを知るためにこれを使用
[some_hash] = Facebook が xsrf を防止するために使用

次に、Apache mod_rewrite を使用して着信データを処理するための小さな PHP スクリプトを用意しました。

サーバーの fb_connect フォルダーにある .htaccess

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
}

?>

これは私にとってかなりのトリックです。ご不明な点がございましたら、お気軽にお問い合わせください。

よろしく

于 2012-06-13T10:43:11.247 に答える