Symfony2 api 的身份验证(供移动应用程序使用)

Posted

技术标签:

【中文标题】Symfony2 api 的身份验证(供移动应用程序使用)【英文标题】:Authentication for a Symfony2 api (for mobile app use) 【发布时间】:2011-10-08 19:08:03 【问题描述】:

我为我的 Symfony2 应用程序开发了一个 REST api。此 api 将由移动应用程序使用。大部分功能是在当前经过身份验证的用户的上下文中完成的,即:

$this->container->get('security.context')->getToken()->getUser()

我希望移动应用能够像传统的网络表单一样发布到登录操作。如果凭证签出,那么 Symfony2 会执行此操作并设置一个 cookie(这甚至可以在移动应用程序访问 api 的上下文中工作吗?)。然后稍后来自该手机的 api 请求将(希望)与本机 symfony2 security.context 服务容器一起使用。

这行得通吗?在将 API 提供给移动开发人员之前,我需要弄清楚这个授权过程。如果可能的话,我显然希望能够使用本机 security.context 服务,而不是为使用 xAuth 或类似东西的 api 构建新的身份验证系统。

谢谢

【问题讨论】:

【参考方案1】:

我认为你应该做到无状态(没有 cookie)。

我遇到了同样的问题,我做了什么:

在您的 app/config/security.yml 中,添加: 安全: ... 防火墙: 休息网络服务: 模式:/webservice/rest/.* 无状态:真 http_basic: 提供者:提供者名称 ... 现在您可以向您的网络服务发出请求:
class AuthTest extends WebTestCase 

    public function testAuthenticatedWithWebservice() 
    
        $client = $this->createClient();

        // not authenticated
        $client->request('GET', '/webservice/rest/url');
        $this->assertEquals(401, $client->getResponse()->getStatusCode());

        // authenticated
        $client->request('GET', '/webservice/rest/url', array(), array(), array(
            'php_AUTH_USER' => 'username', 
            'PHP_AUTH_PW' => 'password'
        ));
        $this->assertEquals(200, $client->getResponse()->getStatusCode());
    

【讨论】:

嗯,很有趣。我不太确定我是否遵循这里的所有内容。你能介绍一个完整的案例吗?即用户 foo 向移动应用程序提供他们的用户名/密码。然后,该应用程序在对 API 的每个请求中都包含该用户名和密码?明文?那安全吗?对不起,如果我在这里误解了一些东西! 正如 dondlero 所说,您必须禁用 cookie,这就是我将无状态参数添加为 true 的原因。我个人不喜欢摘要式身份验证,因为它很难实现。 Http基本方法很简单,效果很好。用户名和密码在每个请求中都可见。您必须使用 SSL 证书。 奇怪,即使设置了stateless: true,我仍然收到Set-Cookie 标头。知道为什么会发生这种情况吗? @AdamMonsen,延迟响应,你重建缓存了吗? @OwenBeresford 迟到总比不到好!我不记得了,但我可能记得。我想我以前做 Symfony2 开发时通常会尝试这样做。【参考方案2】:

给你,How to create a custom Authentication Provider 很棒的文章。

要通过 api 对 Symfony2 应用程序进行身份验证,您需要使用: WS-Security

【讨论】:

【参考方案3】:

是的,Marc,jules 指的是一个示例,只是为了向您展示如何使用 http_basic 测试身份验证。

要使用 RESTful,您应该避免使用 cookie,否则只需将其称为 API。关于您的身份验证系统的安全性,您可以使用 http_digest over https 或更安全的签名请求使用 api_key/api_secret 方法。

看看这里http://wiki.zanox.com/en/RESTful_API_authentication

【讨论】:

以上是关于Symfony2 api 的身份验证(供移动应用程序使用)的主要内容,如果未能解决你的问题,请参考以下文章

为移动应用程序创建 API - 身份验证和授权

在 Symfony2 中使用自定义身份验证提供程序

带有 RESTful 身份验证的 Symfony2 应用程序,使用 FOSRestBundle 和 FOSUserBundle

通过安全令牌进行 API 身份验证的最佳实践(Node.js 服务器和移动应用程序)

通过使用 Symfony2 的 API 使用用户密码进行身份验证

具有同源策略和 OAuth 的 REST API 身份验证