我有一个OAuth API,需要用户名和密码才能获取用户对象(资源所有者密码凭据流) . 我想要得到这个最终结果:
-
用户输入用户名/密码
-
Symfony交换用户名/密码以访问和刷新令牌,然后获取User对象并使用获取的对象填充令牌
-
用户现已在网站上进行身份验证
我遇到的问题是我似乎无法弄清楚如何以我能看到的最佳方式:用户提供商 . UserProviderInterface要求实现loadUserByUsername(),但我不能这样做,因为我需要用户名和密码来获取用户对象 .
我试图实现SimplePreAuthenticatorInterface,但我仍遇到同样的问题:在 createToken()
中创建PreAuthenticated令牌后,我需要使用 authenticateToken()
对其进行身份验证,我仍然无法通过UserProvider获取用户,因为我首先必须使用用户名/密码获取一个访问令牌'd allow me to fetch the User object. I thought about adding a method to login in my UserProvider that'使用用户名/密码通过API登录并存储数组中任何用户名的登录令牌,然后通过该阵列中的用户名获取令牌,但这感觉不对 .
我是从错误的角度看它吗?我根本不应该使用PreAuthenticated令牌吗?
1 回答
前段时间我需要实现一种通过Web服务对用户进行身份验证的方法 . 这就是我最终基于这个doc以及symfony核心的表单登录实现 .
首先创建一个表示请求中存在的用户身份验证数据的令牌:
我存储的AuthSessionID是从Web服务返回的令牌,允许我作为经过身份验证的用户执行请求 .
创建一个Webservice身份验证侦听器,负责向防火墙发送请求并调用身份验证提供程序:
创建一个Webservice登录工厂,我们进入安全组件,并告诉用户提供程序和可用选项:
创建一个身份验证提供程序,以验证WebserviceAuthToken的有效性
最后创建一个用户提供商 . 在我收到来自webservice的响应后,我检查用户是否存储在redis上,如果没有,我创建它 . 之后,用户总是从redis加载 .
所需服务:
配置安全性:
如果您有任何疑问,请告诉我 .