FOSUserBundle 是一个 Symfony 框架的用户管理扩展包,它提供了用户认证、注册、密码重置等功能。Google+ 身份验证是一种通过 Google 的 OAuth 2.0 服务进行用户身份验证的方法。
Google+ 身份验证属于 OAuth 2.0 授权框架的一种实现方式,具体类型为“授权码流程”(Authorization Code Flow)。
适用于需要用户身份验证的 Web 应用,特别是那些希望提供便捷登录方式的应用。
原因:
解决方法:
# app/config/config.yml
fos_user:
firewall_name: main
user_class: AppBundle\Entity\User
from_email:
address: "%mailer_user%"
sender_name: "%mailer_user%"
hwi_oauth:
firewall_name: main
resource_owners:
google:
type: google
client_id: <YOUR_CLIENT_ID>
client_secret: <YOUR_CLIENT_SECRET>
scope: "email profile"
options:
access_type: offline
fosub:
username_iterations: 30
原因:
解决方法:
// src/Bundle/UserBundle/EventListener/AuthentificationListener.php
namespace AppBundle\EventListener;
use HWI\Bundle\OAuthBundle\Security\Core\Exception\AccountNotLinkedException;
use HWI\Bundle\OAuthBundle\Security\Core\Exception\AccountNotConnectedException;
use HWI\Bundle\OAuthBundle\Security\Core\User\FOSUBUserProvider;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException;
use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;
use Symfony\Component\Security\Core\Exception\InvalidCsrfTokenException;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;
class AuthentificationListener extends FOSUBUserProvider
{
protected $requestStack;
public function __construct(RequestStack $requestStack)
{
$this->requestStack = $requestStack;
}
public function loadUserByOAuthUserResponse(UserResponseInterface $response)
{
$username = $response->getUsername();
$user = $this->findUserByUsername($username);
if (!$user) {
$user = $this->createUser($response);
$this->saveUser($user);
}
return $user;
}
protected function findUserByUsername($username)
{
return $this->userManager->findUserByUsername($username);
}
protected function createUser(UserResponseInterface $response)
{
$user = $this->userManager->createUser();
$user->setUsername($response->getUsername());
$user->setEmail($response->getEmail());
$user->setFirstName($response->getFirstName());
$user->setLastName($response->getLastName());
return $user;
}
protected function saveUser(UserInterface $user)
{
$this->userManager->updateUser($user);
}
}
通过以上配置和代码示例,你应该能够成功集成 FOSUserBundle 和 Google+ 身份验证。如果遇到其他问题,请参考相关文档或社区支持。
领取专属 10元无门槛券
手把手带您无忧上云