我正在尝试将 symfony2 与 facebook sdk 集成。我知道已经有一个很好的捆绑包,但我想开发自己的机制。
这是我解决这个问题的方法。使用 facebook 登录并授权我的应用程序后,facebook 会重定向到我事先指定的 url。该 url 映射到此控制器的方法:
public function facebookLoginAction(Request $request) {
$facebook = $this->get("facebook");
$data = $facebook->api('/me', 'GET');
if ($data) {
$user = new AuthenticatedUser($data["name"], md5($data["id"]), "");
$token = new UsernamePasswordToken($user, $data["id"], 'secured_area', $user->getRoles());
$authToken = $this->get('security.authentication.manager')->authenticate($token);
$this->get('security.context')->setToken($authToken);
}
return new Response("<pre>" . print_r($token, true));
}
通过这样做,我试图强制用户登录,以便当他或她从 facebook 回来时,他已经全部排序。
为了 compelteness 的缘故,这里的AuthenticatedUser
代码:
namespace Nourdine\BasicBundle\Security\User;
use Symfony\Component\Security\Core\User\UserInterface;
class AuthenticatedUser implements UserInterface {
private $username;
private $password;
private $salt;
/**
* @param string $username
* @param string $password This md5-ied!
* @param string $salt The salt is empty at the mo!
*/
public function __construct($username, $password, $salt) {
$this->username = $username;
$this->password = $password;
$this->salt = $salt;
}
public function getRoles() {
return array("ROLE_USER");
}
public function getPassword() {
return $this->password;
}
/**
* @link http://symfony.com/doc/current/cookbook/security/custom_provider.html
* If getSalt() returns nothing, then the submitted password is simply encoded using the algorithm you specify in security.yml
*/
public function getSalt() {
return $this->salt; // this is empty indeed
}
public function getUsername() {
return $this->username;
}
public function eraseCredentials() {
}
public function equals(UserInterface $user) {
if (!$user instanceof WebserviceUser) {
return false;
}
if ($this->password !== $user->getPassword()) {
return false;
}
if ($this->getSalt() !== $user->getSalt()) {
return false;
}
if ($this->username !== $user->getUsername()) {
return false;
}
return true;
}
}
因为我知道这很重要,所以我想指出这secured_area
是我的防火墙的名称!这里:
<firewall name="secured_area" pattern="^/">
<anonymous />
<form-login login_path="/login" check_path="/login_check" />
<logout path="/logout" target="/" />
</firewall>
也不是说在控制器中使用的名为“facebook”的服务只不过是Facebook
来自官方 sdk 的类的一个实例。这是 services.xml 中的定义
<service id="facebook" class="Facebook">
<argument>%facebook.params%</argument>
</service>
任何想法?我做错了什么?用户提供者的概念是否以某种方式参与了这一切?即使登录实际上是强制的?
干杯