1

我正在尝试将 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 机制。

4

1 回答 1

1

您可以使用 LightOpenID 实现自己的身份验证提供程序,也可以在验证身份后设置会话变量并依靠它来验证您的用户。

查看此实现https://github.com/KnpLabs/marketplace/blob/master/src/Marketplace/Provider/Service/Security.php以获取第二种方法的示例。

于 2013-10-16T13:19:44.520 回答