3

在我的 symfony2 项目中,我使用 FOSUSerBundle 在网站上登录、注册等。正如我所料,工作正常。但现在我想构建一个 REST API,以便 android 应用程序可以充当客户端并处理数据。我发现 FOSRestBundle 在 symfony2 项目中构建 REST API。我想使用 FOSOAuthServerBundle 来处理访问 api 的令牌。用户应该通过 API 登录,然后他可以使用 api 提供的其他方法。

我阅读了很多博客和其他文档,但找不到如何构建 REST Api。我设置了每个 Bundle,并生成了一个带有公共 ID 和安全代码的客户端。在网站上,我可以使用登录。

但是我必须在我的 REST API 控制器中定义哪些步骤/方法才能使用令牌身份验证?

谢谢!

4

2 回答 2

0

在此链接中,您将找到一个很好的示例来开发您的第一个 REST api。

祝你好运。

于 2014-05-14T16:06:26.253 回答
0

我最近使用 FOSUser FOSOAuthServer 和 FOSRest Bundles 设置了一个 API。

在我的 security.yml 我有以下内容:

security:

    encoders:
        FOS\UserBundle\Model\UserInterface: bcrypt

    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: ROLE_ADMIN

    providers:
        fos_userbundle:
            id: fos_user.user_provider.username

    firewalls:
        # disables authentication for assets and the profiler, adapt it according to your needs
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false

        oauth_token:                                   # Everyone can access the access token URL.
            pattern: ^/login
            security: false

        api:
            pattern: /                                 # All URLs are protected
            fos_oauth: true                            # OAuth2 protected resource
            stateless: true                            # Do no set session cookies
            anonymous: false

    access_control:
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/admin/, role: ROLE_ADMIN }

这允许匿名访问登录路由,而其他所有路由都需要身份验证。

我创建了一个登录路由,将请求代理到 OAuth 客户端。这样用户永远不会知道客户端密码:(注意我在示例中删除了客户端 ID 和密码)

/**
 * @Post("/login")
 */
public function postLoginAction(Request $request){
    $request->request->add( array(
        'grant_type' => 'password',
        'client_id' => 'clientID_clientRandomID',
        'client_secret' => 'clientSecret'
    ));

    return($this->get('fos_oauth_server.controller.token')->tokenAction($request));
}

如果提交了有效的用户/通行证,这将返回 OAuth 令牌。

一旦我有了这个令牌,我就可以将它添加到任何请求的标头中

Authorization: Bearer OAuth_TOKEN 

验证用户后,您可以随时在任何 api 调用中检查他们的角色(如果需要)。类似于以下内容:

public function getUserAction()
{
    $this->denyAccessUnlessGranted('ROLE_ADMIN', null, 'Unable to access this page!');

    $user = $this->getUser();

    $view = $this->view($user);
    return $this->handleView($view);
}  

另一种检查角色的方法可以在 security.yml 中完成

# app/config/security.yml
security:
# ...
    access_control:
        - path: "^/api/users/\d+$"
          allow_if: "'DELETE' == request.getMethod() and has_role('ROLE_ADMIN')"

我在以下帖子中发现了这一点:RESTFul OAuth with FOSOAuthServer / FOSRest & FOSUser

这就是我处理 Symfony3 构建的方式,某些语法(检查用户角色)可能与 Symfony2 不同

我在构建我的 api 时使用这篇文章作为参考:http ://williamdurand.fr/2012/08/02/rest-apis-with-symfony2-the-right-way/

于 2016-02-12T22:42:03.693 回答