PHPで明示的にCookieを設定しているため、Saschaが提供したものと同様の解決策を最終的に採用しましたが、少し調整しました。
// excecute this code if user has not authorized the application yet
// $facebook object must have been created before
$accessToken = $_COOKIE['access_token']
if ( empty($accessToken) && strpos($_SERVER['HTTP_USER_AGENT'], 'Safari') ) {
$accessToken = $facebook->getAccessToken();
$redirectUri = 'https://URL_WHERE_APP_IS_LOCATED?access_token=' . $accessToken;
} else {
$redirectUri = 'https://apps.facebook.com/APP_NAMESPACE/';
}
// generate link to auth dialog
$linkToOauthDialog = $facebook->getLoginUrl(
array(
'scope' => SCOPE_PARAMS,
'redirect_uri' => $redirectUri
)
);
echo '<script>window.top.location.href="' . $linkToOauthDialog . '";</script>';
これが行うことは、ブラウザがSafariのときにCookieが使用可能かどうかを確認することです。次のステップでは、アプリケーションドメイン、つまり上記のURL_WHERE_APP_IS_LOCATEDとして提供されたURIを使用します。
if (isset($_GET['accessToken'])) {
// cookie has a lifetime of only 10 seconds, so that after
// authorization it will disappear
setcookie("access_token", $_GET['accessToken'], 10);
} else {
// depending on your application specific requirements
// redirect, call or execute authorization code again
// with the cookie now set, this should return FB Graph results
}
したがって、アプリケーションドメインにリダイレクトした後、Cookieが明示的に設定され、ユーザーを承認プロセスにリダイレクトします。
私の場合(CakePHPを使用しているため、他のMVCフレームワークでも問題なく機能するため)FB認証がもう一度実行されるログインアクションを再度呼び出していますが、今回は既存のCookieが原因で成功します。
アプリを1回承認した後、Safari(5.1.6)でアプリを使用する際に問題は発生しなくなりました。
それが誰にも役立つことを願っています。