如何访问Symfony中已登录的Auth0用户的电子邮件地址?

问题描述

我按照this教程在Symfony中使用Auth0设置了Oauth2登录。

如何访问已登录的Auth0用户的电子邮件地址?

注意:

  • 登录成功(通过Google在auth0端通过oauth2,然后重定向回去)
  • 控制器中的
  • $this->getUser()显示正确的用户名
  • hwi_oauth.yaml中配置的
  • 范围:openid profile email
  • Auth0记录(在其管理控制台上)包含用户的电子邮件地址
  • 文章底部引用了OAuthUserProvider来获取用户数据,但是我已经加载了该服务并再次仅获取了用户名

我的代码与the article I referenced相同。

这是我需要访问其电子邮件地址的控制器,其后是dd($this->getUser()的输出。

class UserController extends AbstractController
{
    /**
     * @Route("/user",name="user")
     */
    public function index()
    {
        dd($this->getUser());

        return $this->render('user/index.html.twig',[
            'controller_name' => 'UserController',]);
    }
}

^ HWI \ Bundle \ OAuthBundle \ Security \ Core \ User \ OAuthUser {#580▼
#username:“ coder1”}

解决方法

您必须使用HWI \ Bundle \ OAuthBundle \ Security \ Core \ User \ OAuthUser类扩展您的User实体,并使用您自己的类扩展HWI \ Bundle \ OAuthBundle \ Security \ Core \ User \ OAuthUserProvider类。

然后将其注册为服务,并在防火墙设置中使用它。这是一篇介绍它的文章: https://inchoo.net/dev-talk/symfony-hwioauthbundle-and-google-sign-in/

在OAuthUserProvider类中,您可以修改loadUserByOAuthUserResponse并从数据库中加载用户。

以下是重要的代码段:

更新防火墙

oauth_user_provider:
    service: ib_user.oauth_user_provider

添加服务

hwi_oauth.user.provider.entity:
    class: HWI\Bundle\OAuthBundle\Security\Core\User\OAuthUserProvider
ib_user.oauth_user_provider:
    class: Foggyline\Bundle\TickerBundle\Auth\OAuthProvider
    arguments: [@session,@doctrine,@service_container]

这是我正在使用的OAuthProvider类:

<?php

namespace App\Auth;

use App\Repository\UserRepository;
use HWI\Bundle\OAuthBundle\Security\Core\User\OAuthUserProvider;
use HWI\Bundle\OAuthBundle\OAuth\Response\UserResponseInterface;
use App\Entity\User;

class OAuthProvider extends OAuthUserProvider
{
    protected $session,$doctrine,$admins,$userRepository;

    public function __construct($session,$service_container,UserRepository $userRepository)
    {
        $this->session = $session;
        $this->doctrine = $doctrine;
        $this->container = $service_container;
        $this->userRepository = $userRepository;
    }

    public function loadUserByUsername($username)
    {
        $result = $this->userRepository->findBy(['name' => $username]);

        if (count($result)) {
            return $result[0];
        } else {
            return new User($username);
        }
    }

    public function loadUserByEmail($email)
    {
        $result = $this->userRepository->findBy(['email' => $email]);

        if (count($result)) {
            return $result[0];
        } else {
            return new User($email);
        }
    }

    public function loadUserByOAuthUserResponse(UserResponseInterface $response)
    {
        //Data from response
        $email = $response->getEmail();
        $nickname = $response->getNickname();
        $realname = $response->getRealName();
        $avatar = $response->getProfilePicture();

        //set data in session
        $this->session->set('email',$email);
        $this->session->set('nickname',$nickname);
        $this->session->set('realname',$realname);
        $this->session->set('avatar',$avatar);

        $result = $this->userRepository->findBy(['email' => $email]);

        if (!count($result)) {
            $user = new User($email);
            $user->setName($realname);
            $user->setEmail($email);
            $user->setRoles(['ROLE_USER']);

            $factory = $this->container->get('security.encoder_factory');
            $encoder = $factory->getEncoder($user);
            $password = $encoder->encodePassword(md5(uniqid()),$user->getSalt());
            $user->setPassword($password);
        } else {
            $user = $result[0];
            $user->setUsername($realname);
        }

        $em = $this->doctrine->getManager();
        $em->persist($user);
        $em->flush();

        //set id
        $this->session->set('id',$user->getId());

        return $this->loadUserByEmail($response->getEmail());
    }
}
,

使用$this->getUser(),您将从当前登录用户的安全令牌中获取UserInterface对象。因此,您可以访问User实体的所有常规方法。您可以这样:

$currentUser = $this->getUser()->getEmail();

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...