Skip to content

Instantly share code, notes, and snippets.

@Rick-Mason
Last active August 14, 2019 03:53
Show Gist options
  • Select an option

  • Save Rick-Mason/a63f968baf4fb828daa34123f3d89724 to your computer and use it in GitHub Desktop.

Select an option

Save Rick-Mason/a63f968baf4fb828daa34123f3d89724 to your computer and use it in GitHub Desktop.
Symfony3 HWIOauthBundle FOSUBundle with Google Login
$bundles = [
// ....
new FOS\UserBundle\FOSUserBundle(),
new HWI\Bundle\OAuthBundle\HWIOAuthBundle(),
//....
];
//added to bottom of config file
fos_user:
db_driver: orm # other valid values are 'mongodb', 'couchdb' and 'propel'
firewall_name: main
user_class: AppBundle\Entity\User
hwi_oauth:
firewall_names: [main]
fosub:
username_iterations: 30
properties:
google: google_id
resource_owners:
google:
type: google
client_id: <the google client_id>
client_secret: <the google secret>
scope: "email profile"
<?php
namespace AppBundle\Services;
use HWI\Bundle\OAuthBundle\OAuth\Response\UserResponseInterface;
use HWI\Bundle\OAuthBundle\Security\Core\User\FOSUBUserProvider as BaseClass;
use Symfony\Component\Security\Core\User\UserInterface;
/**
* https://gist.github.com/danvbe/4476697
*/
class FOSUBUserProvider extends BaseClass
{
public function connect(UserInterface $user, UserResponseInterface $response)
{
$property = $this->getProperty($response);
$username = $response->getUsername();
//on connect - get the access token and the user ID
$service = $response->getResourceOwner()->getName();
$setter = 'set'.ucfirst($service);
$setter_id = $setter.'Id';
$setter_token = $setter.'AccessToken';
//we "disconnect" previously connected users
if (null !== $previousUser = $this->userManager->findUserBy(array($property => $username))) {
$previousUser->$setter_id(null);
$previousUser->$setter_token(null);
$this->userManager->updateUser($previousUser);
}
//we connect current user
$user->$setter_id($username);
$user->$setter_token($response->getAccessToken());
$this->userManager->updateUser($user);
}
public function loadUserByOAuthUserResponse(UserResponseInterface $response)
{
$data = $response->getResponse();
$username = $response->getUsername();
$email = $response->getEmail() ? $response->getEmail() : $username;
$user = $this->userManager->findUserBy(array($this->getProperty($response) => $username));
//when the user is registrating
if (null === $user) {
$service = $response->getResourceOwner()->getName();
$setter = 'set'.ucfirst($service);
$setter_id = $setter.'Id';
$setter_token = $setter.'AccessToken';
// create new user here
$user = $this->userManager->createUser();
$user->$setter_id($username);
$user->$setter_token($response->getAccessToken());
//I have set all requested data with the user's username
//modify here with relevant data
$user->setUsername($username);
$user->setEmail($email);
$user->setPassword($username);
$user->setEnabled(true);
$this->userManager->updateUser($user);
return $user;
}
//if user exists - go with the HWIOAuth way
$user = parent::loadUserByOAuthUserResponse($response);
$serviceName = $response->getResourceOwner()->getName();
$setter = 'set' . ucfirst($serviceName) . 'AccessToken';
//update access token
$user->$setter($response->getAccessToken());
return $user;
}
}
app:
resource: "@AppBundle/Controller/"
type: annotation
fos_user_security:
resource: "@FOSUserBundle/Resources/config/routing/security.xml"
fos_user_profile:
resource: "@FOSUserBundle/Resources/config/routing/profile.xml"
prefix: /profile
fos_user_register:
resource: "@FOSUserBundle/Resources/config/routing/registration.xml"
prefix: /register
fos_user_resetting:
resource: "@FOSUserBundle/Resources/config/routing/resetting.xml"
prefix: /resetting
fos_user_change_password:
resource: "@FOSUserBundle/Resources/config/routing/change_password.xml"
prefix: /profile
#hwi_oauth_login:
hwi_oauth_security:
resource: "@HWIOAuthBundle/Resources/config/routing/login.xml"
prefix: /login
hwi_oauth_connect:
resource: "@HWIOAuthBundle/Resources/config/routing/connect.xml"
prefix: /login
hwi_oauth_redirect:
resource: "@HWIOAuthBundle/Resources/config/routing/redirect.xml"
prefix: /login
#the following route does not seem to be working
google_login:
path: /login/check-google
# app/config/security.yml
security:
encoders:
FOS\UserBundle\Model\UserInterface: bcrypt
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: ROLE_ADMIN
providers:
fos_userbundle:
id: fos_user.user_provider.username_email
database_users:
entity:
class: AppBundle:MTI_Cart\User
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
pattern: ^/
form_login:
provider: fos_userbundle
login_path: /login
check_path: /login_check
csrf_token_generator: security.csrf.token_manager
oauth:
resource_owners:
google: "/login/check-google"
login_path: /login
failure_path: /login
use_forward: false
oauth_user_provider:
service: my_user_provider
anonymous: true
login:
pattern: ^/login$
security: false
#remember_me:
# key: "%secret%"
# lifetime: 31536000 # 365 days in seconds
# path: /
# domain: ~ # Defaults to the current domain from $_SERVER
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 }
# Learn more about services, parameters and containers at
# http://symfony.com/doc/current/book/service_container.html
parameters:
my_user_provider.class: HWI\Bundle\OAuthBundle\Security\Core\User\FOSUBUserProvider
services:
# service_name:
# class: AppBundle\Directory\ClassName
# arguments: ["@another_service_name", "plain_value", "%parameter_name%"]
my_user_provider:
class: '%my_user_provider.class%'
arguments: ['@fos_user.user_manager',{google: google_id}]
<?php
// src/AppBundle/Entity/User.php
// dont forget to run ./bin/console doctrine:generate:entities to get your getters and setters
namespace AppBundle\Entity;
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="users")
*/
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(name="google_id", type="string", length=255, nullable=true)
*/
protected $google_id;
/**
* @ORM\Column(name="google_access_token", type="string", length=255, nullable=true)
*/
protected $google_access_token;
public function __construct()
{
parent::__construct();
// your own logic
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment