我想使用FOSOAuthServerBundle提供一个使用OAuth2保护的RESTful API,我不确定我该做什么.
我按照文档中的基本步骤进行操作,但有些东西丢失了,我无法找到我需要的完整示例.
所以,我试着理解这个实现最好的例子(我发现的唯一一个),但仍有一些我不理解的事情.
首先,为什么我们需要API中的登录页面?假设我的客户端是iPhone或Android应用程序,我看到应用程序上登录页面的兴趣,但我认为客户端只需从API调用Web服务来获取其令牌,我错了吗?那么如何通过REST端点实现自动化和令牌提供?
然后,文档告诉写这个防火墙:
oauth_authorize:
pattern: ^/oauth/v2/auth
# Add your favorite authentication process here
Run Code Online (Sandbox Code Playgroud)
我不知道如何添加身份验证过程.我应该自己编写一个,例如在本教程之后还是我完全错了?
在全球范围内,有人可以花时间在文档中的五个步骤之后解释所需的过程,以提供OAuth2安全的RESTful API吗?这将是非常好的......
在@Sehael回答之后编辑:
在它完美之前我还有一些问题......
这里的"客户"代表什么?对于exemaple,我应该为iPhone应用程序创建一个客户端,为Android应用程序创建另一个客户端吗?我是否必须为每个想要使用API的实例创建一个新客户端?在这种情况下,最佳做法是什么?
与您不同,我不会将OAuth流程用于前端网站,而是使用"经典"symfony方式.你觉得这很奇怪,还是正常的?
refresh_token的用处是什么?如何使用它?
我试图测试我的新OAuth受保护服务.我使用支持OAuth 1.0的POSTman chrome扩展,OAuth2看起来像OAuth1足以用POSTman进行测试吗?有一个"秘密令牌"字段,我不知道如何填写.如果我不能,我很高兴看到你的(@Sehael)PHP课程,就像你提出的那样./编辑:好的我觉得我找到了这个答案.我刚刚添加了access_token作为GET参数的令牌作为值.它似乎工作.不幸的是,我必须对bundle代码进行反向engenering才能找到它而不是在文档中读取它.
无论如何,非常感谢!
我有一个使用FosOauth2Serverbundle,FosRestBundle和FosUserBundle在Symfony2中编写的RESTful Api.我计划在我的api前面涂清漆作为反向代理.由于我的应用程序使用我的api总是发送access_token作为参数或标头清漆缓存几乎每个请求作为不同的请求,它是无效的.因为我在我的控制器中使用access_token的用户来保证安全性,有时用于内容,所以我无法从vcl_recv中的请求中完全删除access_token请求.在互联网上进行了几次搜索之后,我遇到了一个身份验证解决方案http://www.adayinthelifeof.nl/2012/07/06/using-varnish-to-offload-and-cache-your-oauth-requests/.但是,我无法弄清楚如何告诉FosUserBundle当前用户在header中传递security.yml中的安全性:
access_control:
- { path: ^/2013-08-30/foo$, role: ROLE_USER, requires_channel: https, methods: [GET] }
Run Code Online (Sandbox Code Playgroud)
简而言之,我怎样才能告诉FosUserBundle当前用户的请求(从清漆发送)标头?
varnish symfony oauth-2.0 fosuserbundle fosoauthserverbundle
目前我的项目运作良好.我使用FOSUserBundle来管理我的用户.现在,我想实现OAuth,所以我使用的是FOSOAuthServerBundle.大多数开发人员推荐使用此捆绑包来实现OAuth.
我按照FOSOAuthServerBundle的文档.通常,我必须在我的security.yml中添加更多信息,但我不确切知道我要做什么......
这是我的security.yml:
security:
encoders:
Symfony\Component\Security\Core\User\User: plaintext
Moodress\Bundle\UserBundle\Entity\User: sha512
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
providers:
main:
id: fos_user.user_provider.username
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
oauth_token:
pattern: ^/oauth/v2/token
security: false
oauth_authorize:
pattern: ^/oauth/v2/auth
main:
pattern: ^/
fos_oauth: true
stateless: true
anonymous: true
Run Code Online (Sandbox Code Playgroud)
我想有一些信息可以添加到防火墙中吗?
我真的不知道如何使用FOSUserBundle制作FOSOAuthServerBundle.之前,只使用FOSUserBundle,我使用了登录表单和FOSUserBundle的登录检查.既然我已经完成了FOSOAuthServerBundle的所有基本配置,那我接下来要做什么?我应该使用哪种表格?哪个登录检查?令牌是由FOSOAuthServerBundle自动创建的?在文档中,它们展示了如何创建客户端...我应该在我的项目中添加此代码吗?如果是的话...在哪里?:/
我在网上找到了这篇文章:http://blog.logicexception.com/2012/04/securing-syfmony2-rest-service-wiith.html
我试图实现这个,但我不相信我们需要添加所有这些文件才能使它工作......
如果有人知道如何使用FOSUserBundle制作FOSOAuthServerBundle,那将非常有用.
我有一个基本的api,使用FOSOAuthServerBundle验证用户.用户可以拥有ROLE_USER和ROLE_ADMIN角色.基于FOSOAuthServerBundle文档,默认行为是使用范围的角色,所以我认为,当我有一个普通用户,捆绑将返回scope: user的响应,并且当它是一个管理员用户,将返回scope: admin.但它不是这样的.捆绑包返回supported_scopes条目中配置的任何内容.以下是我的config.yml.
fos_oauth_server:
service:
options:
supported_scopes: user admin
Run Code Online (Sandbox Code Playgroud)
我的access_control部分security.yml是空的,我的firewalls部分如下:
firewalls:
users_create:
pattern: ^/v1/users
methods: [POST]
security: false
api:
pattern: ^/
security: true
fos_oauth: true
stateless: true
access_control:
# You can omit this if /api can be accessed both authenticated and anonymously
Run Code Online (Sandbox Code Playgroud)
这样user admin,即使用户没有ROLE_ADMIN角色,bundle也始终作为作用域返回.
{
"access_token": "ZGQ2ODE5ZjAzNTZkOWY0OWMyNmZmODE4MjcwZTJmYjExNzY0NzQxOTRmMzk4NzA2Mjc2NjIyZmY1ZDgwMzk4NA"
"expires_in": 3600
"token_type": "bearer"
"scope": "user admin"
"refresh_token": "NmM5ZGFmNzBiNTNjYmQzMTQ1MTk0ODJjOTAxMWU0YWIwMzM1MzgyODg4ZTAzNTI5ZTk2MDc3OGU2MTg0MWZiMA"
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么?用户角色是否附加到令牌范围?有没有更好的方法来了解我的用户是否是管理员?
从我在这里看到的,在查询字符串参数中保存敏感数据(如access_token)不是一个好主意.
即:我试图避免这种情况:
http://localhost.dev/web/app_dev.php/api/articles?access_token=NzJhNz.....
Run Code Online (Sandbox Code Playgroud)
因此,我尝试使用access_tokenAuthorization标头中的api请求(这里建议使用.当尝试这样做时,我收到以下错误:
{
"error": "access_denied",
"error_description": "OAuth2 authentication required"
}
Run Code Online (Sandbox Code Playgroud)
但是,请求与此完全相同,并且令牌似乎已正确设置:
GET /web/app_dev.php/api/articles HTTP/1.1
Host localhost.dev
Authorization access_token=N2FmNzhhNGM2MTI5N2JhMWJlYjEdZjA0ZWM3ZTRhMTM1OGM0ODJjMzQzYjM7NTk3ZTEzNTVjZDczZTljMDk2MQ
Accept-Encoding gzip, deflate
Accept application/json
Accept-Language en;q=1, fr;q=0.9, de;q=0.8, ja;q=0.7, nl;q=0.6, it;q=0.5
Connection keep-alive
User-Agent Localhost/1.0 (iPhone; iOS 6.1.4; Scale/2.00)
Run Code Online (Sandbox Code Playgroud)
有没有人知道这是否可行FOSOAuthServerBundle?
注意:我在浏览器中验证过,令牌仍然有效(未过期).
我已经使用Symfony 2和FOSOAuthServerBundle成功安装并测试了OAuth 2工作流程。
我可以请求代码,并且可以通过我已设置的第三方测试页上的“使用...登录”按钮成功获取一对访问/刷新令牌,并可以通过自定义API调用从我的API中检索用户。这里很酷。
但是,每次我从头开始测试流程时,我的oAuth服务器都会继续在授权页面上重定向用户。这是我的问题。
有没有一种简单的方法可以使用Symfony上的FOSOAuthServerBundle在控制器上获取当前客户端?
我在客户端实体上有一些属性,想在控制器中读取它们,但是我找不到获取当前客户端的方法。
我只找到了获取当前用户($this->container->get('security.context')->getToken()->getUser();)的方法,但没有找到当前客户端的方法。
编辑:我现在已经找到了获取客户端的方法,但是它没有向我显示我添加到我的客户端实体的属性的值。如下代码:
$token = $this->container->get('security.context')->getToken()->getToken();
$accessToken = $this->container->get('fos_oauth_server.access_token_manager.default')->findTokenBy(array('token' => $token));
$client = $accessToken->getClient();
\Doctrine\Common\Util\Debug::dump($client);
Run Code Online (Sandbox Code Playgroud)
正在倾销:
object(stdClass)[1180]
public '__CLASS__' => string 'CC\APIBundle\Entity\Client' (length=26)
public '__IS_PROXY__' => boolean true
public '__PROXY_INITIALIZED__' => boolean false
public 'id' => int 6
public 'name' => null
public 'city' => null
public 'randomId' => null
public 'secret' => null
public 'redirectUris' =>
array (size=0)
empty
public 'allowedGrantTypes' => null
Run Code Online (Sandbox Code Playgroud)
所以我的客户在db上的名称和城市没有显示...我也认为有很多对db的调用可以用非常优雅的方式避免...
有任何想法吗?
我已经设置了一个应用程序:
我已经成功创建了一个客户端,并且可以使用这样的URL获取访问令牌
但是,当我尝试访问这样的网址时,请访问 http://api.mydomain.com/api/surgeries/45/details?access_token=ACCESS_TOKEN
我被重定向到symfony登录页面,但我不能拥有它,或者我构建的移动应用程序使用此REST API将无法访问.
我使用本教程进行设置(删除那里的User/UserRepository类并将其改为与FOSUserBundle一起使用)http://blog.tankist.de/blog/2013/07/16/oauth2-explained-part-1原理-和-术语/
我不确定我告诉symfony重定向到登录页面的位置,我想将该逻辑更改为仅从令牌进行身份验证.
这是我的设置概述
security.yml
security:
encoders:
FOS\UserBundle\Model\UserInterface: sha512
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: ROLE_ADMIN
providers:
fos_userbundle:
id: fos_user.user_provider.username
firewalls:
...
login:
pattern: ^/secured/login$
security: false
oauth_token:
pattern: ^/oauth/v2/token
security: false
oauth_authorize:
pattern: ^/oauth/v2/auth
form_login:
provider: fos_userbundle
check_path: _security_check
login_path: _demo_login
anonymous: true
api:
pattern: ^/api
fos_oauth: true
stateless: true
anonymous: false # can be omitted as its default value
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: …Run Code Online (Sandbox Code Playgroud) 从上周开始我就在尝试让 FOS Auth Server Bundle 与 Symfony4 一起工作。如果我想使用我创建的创建客户端命令,则会出现此错误消息。
编译容器时,“fos_oauth_server.client_manager.default”服务或别名已被删除或内联。您应该将其公开,或者停止直接使用容器并改为依赖项注入。
有人有同样的问题吗?
使用FOSOAuthServerBundle的标准端点(使用FOSUserBundle),我可以通过提供client_id,client_secret,用户和密码组合来检索访问和刷新令牌.响应如下:
{
"accessToken": "YTg2ZTJkNTY2MGM5MGQyNzZjYjkyZWMwYzg1YTZmZTZmOTIyMzAxNDY2MTkwZDU5ODYzZTAzYmIyNDI0YTQ4ZQ",
"expiresIn": 3600,
"tokenType": "bearer",
"refreshToken": "OTU1MGZhNDQ2ODFkZDUzMmQ4Y2FhNTk5OWM0NWFlNDk0YTY0ZDZhOTRjZTUwM2JlYTE3MDkxYzU3ZWY1OGRkYQ"
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,如何通过传递客户端和用户凭据以编程方式检索类似的数据?即如何从我的应用程序的另一部分进行相同的调用而不通过HTTP(慢),而是直接通过捆绑代码(快速)?
我确信必须有一个简单的方法来做到这一点,但到目前为止我能找到的最好的是这个https://github.com/FriendsOfSymfony/FOSOAuthServerBundle/issues/347并没有真正实现与HTTP调用.