OpenID を Silex アプリケーションに統合しようとしていますが、それをSilex の認証サービス プロバイダーにフックする方法がわかりません。彼らは認証と承認をバンドルしているようですが、私はあまり熱心ではありません。
私がこれまでに持っているもの:
まず、 LightOpenIDを使用して OpenID ログイン URL を生成し、それを Twig テンプレートに挿入します。
$app['openid'] = $app->share(function (Application $app) {
$openid = new \LightOpenID($app['request']->getHttpHost());
$openid->identity = 'https://www.google.com/accounts/o8/id';
$openid->returnUrl = $app->url('check_openid', array('returnUrl' => $app['request']->get('returnUrl', $app['request']->getRequestUri())));
return $openid;
});
$app->before(function (Request $request) use ($app) {
// todo: check if user is logged in, if not generate OpenID login url
$app['twig']->addGlobal('openid', array('authUrl' => $app['openid']->authUrl()));
});
そして、それを私のTwigレイアウトの一部としてレンダリングします:
<a href="{{ openid.authUrl }}" class="btn btn-google-plus btn-xs" type="button"><i class="icon-google-plus"></i> Sign in with Google</a>
そのリンクをクリックすると、Googleが認証を行い、ここに返信します。
$app->get('/login/openid', function (Request $request) use ($app) {
if(!$app['openid']->mode) {
return $app->redirect($app['openid']->authUrl(), 303);
} elseif($app['openid']->mode === 'cancel') {
// TODO: redirect user back to login page w/ error message
die('User has canceled authentication!');
} elseif($app['openid']->validate()) {
// TODO: log user in (set session variables)
return $app->redirect($request->get('returnUrl', $app->path('home')), 303);
} else {
throw new Exception('User could not be validated');
}
})->bind('check_openid');
私が立ち往生している場所:
Silex/Symfony のセキュリティ「ファイアウォール」を利用できるように、ユーザーをログインさせるにはどうすればよいですか? サイトのセクションを特定のユーザーのみに制限したいのです/admin
が、ACL メカニズム全体を自分で実装したくありません。