Skip to content

Instantly share code, notes, and snippets.

@yahuarkuntur
Last active November 18, 2016 18:23
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save yahuarkuntur/5c7b4b5f9d05106219b8 to your computer and use it in GitHub Desktop.
Save yahuarkuntur/5c7b4b5f9d05106219b8 to your computer and use it in GitHub Desktop.
My Integration of FosUserBundle and HWIOAuthBundle (symfony 2.7 and hwi/oauth-bundle 0.3.9)
fos_user:
db_driver: orm
firewall_name: main
user_class: AppBundle\Entity\Usuario
hwi_oauth:
firewall_name: main
fosub:
username_iterations: 30
properties:
facebook: facebook_id
resource_owners:
facebook:
type: facebook
client_id: "%facebook_appid%"
client_secret: "%facebook_secret%"
scope: "email, public_profile, publish_actions"
<?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;
}
}
fos_user:
resource: "@FOSUserBundle/Resources/config/routing/all.xml"
hwi_oauth_login:
resource: "@HWIOAuthBundle/Resources/config/routing/login.xml"
prefix: /login
hwi_oauth_redirect:
resource: "@HWIOAuthBundle/Resources/config/routing/redirect.xml"
prefix: /connect
facebook_login:
path: /login/check-facebook
app:
resource: "@AppBundle/Controller/"
type: annotation
# your other routes
security:
encoders:
AppBundle\Entity\Usuario: bcrypt
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
providers:
fos_userbundle:
id: fos_user.user_provider.username_email
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_provider: security.csrf.token_manager
oauth:
resource_owners:
facebook: "/login/check-facebook"
login_path: /login
failure_path: /login
oauth_user_provider:
service: app.fos_user.oauth_provider
logout: true
anonymous: true
access_control:
- { path: ^/login, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/connect/, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/, role: ROLE_ADMIN }
- { path: ^/, role: ROLE_USER }
services:
app.fos_user.oauth_provider:
class: AppBundle\Services\FOSUBUserProvider
arguments: [@fos_user.user_manager,{facebook: facebook_id}]
AppBundle\Entity\Usuario:
type: entity
table: usuario
indexes:
usuario_username_idx:
columns: [ username ]
id:
id:
type: integer
generator: { strategy: AUTO }
fields:
facebook_id:
type: string
length: 255
nullable: true
facebook_access_token:
type: string
length: 255
nullable: true
@davidwiniarz
Copy link

I'm getting

Uncaught PHP Exception PropelException: "Unknown column Facebook_id in model FOS\UserBundle\Propel\User" at C:\xampp\htdocs\portalsportowy\vendor\propel\propel1\runtime\lib\query\ModelCriteria.php line 2145
Who can explain me why.

I do have:

fos_user:
db_driver: propel
firewall_name: main
user_class: Back\UserBundle\Model\User
and overriden the fosuerbundle schema.xml with extra facebookId var.

It's propel. Can you help me?

@yamennassif
Copy link

@hariharasudhan94
Copy link

hariharasudhan94 commented Nov 18, 2016

hi, i am new to hwiauth and fosuserbundle ,i am working with google login , i cant understand whats the use of connect(UserInterface $user, UserResponseInterface $response) while loadUserByOAuthUserResponse itself take care of registration and login

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment