在我的symfony2项目中,我正在使用FOSUSerBundle在网站上登录,注册等。正如我所料,工作正常。但是现在我想构建一个REST API,以便Android应用程序可以充当客户端并处理数据。我找到了FOSRestBundle在symfony2项目中构建REST API。我想使用 FOSOAuthServerBundle 来处理访问 API 的令牌。用户应通过 API 登录,然后他可以使用 API 提供的其他方法。
我阅读了很多博客和其他文档,但找不到如何构建 REST API。我设置了每个捆绑包,并生成了一个具有公共 ID 和安全代码的客户端。通过网站,我可以使用登录名。
但是我必须在我的 REST API 控制器中定义哪些步骤/方法才能使用令牌身份验证?
谢谢!
在此链接中,您将找到开发第一个 REST API 的良好示例。
祝你好运。
我最近使用 FOSUser FOSOAuthServer 和 FOSRest Bundles 设置了一个 API。
在我的安全.yml中,我有以下内容:
security:
encoders:
FOSUserBundleModelUserInterface: 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/