hwi/oauth-bundle插件官方文档只简单给出了登录示例,实际工作中往往需要对获取到的用户信息进行存库处理。那如何来处理呢,下面给出我在项目中处理步骤希望能帮助到大家。

  首先创建hwi/oauth-bundle用户提供程序,此类必须继承并实现接口 OAuthAwareUserProviderInterface 。

class OauthUserProvider extends OAuthAwareUserProviderInterface
{public function loadUserByOAuthUserResponse(UserResponseInterface $response){$resourceOwnerName = $response->getResourceOwner()->getName();if (!isset($this->properties[$resourceOwnerName])) {throw new \RuntimeException(sprintf("No property defined for entity for resource owner '%s'.", $resourceOwnerName));}$username = $response->getUsername();switch ($resourceOwnerName) {case 'wechat':$user = $this->findByWeChat($respnse);break;case 'weibo':$user = $this->findUserByWeiBo($response);break;}if (null === $username || null == $user) {throw new AccountNotLinkedException(sprintf("User '%s' not found.", $username));}return $user;}protected function findByWeChat(UserResponseInterface $response){// 参考 findUserByWeiBo
    }protected function findUserByWeiBo(UserResponseInterface $response){$weiBoUserRepository = $this->em->getRepository('AppBundle:WeiBoUser');if (!$weiBoUser = $weiBoUserRepository->findOneBy(['weiBoId' => $response->getResponse()['idstr']])) {$weiBoUser = new WeiBoUser();$weiBoUser->setWeiBoId($response->getResponse()['idstr']);}$weiBoUser->setNickname($response->getNickname())->setHeadImgUrl($response->getProfilePicture())->setResponse($response->getResponse());$weiBoUserRepository->save($weiBoUser);if (!$weiBoUser->getUserId())return null;return $this->em->getRepository('AppBundle:User')->find($weiBoUser->getUserId());}}

这个类的核心关键是 loadUserByOAuthUserResponse(UserResponseInterface $response) 方法。$response参数是一个 UserResponseInterface 实例,当用户被从第三方登录界面重定向回来时 $response便持有了用户的第三方信息数据。$response->getResourceOwner()->getName()返回的是第三方登录的配置名,具体见下面配置示例。此时我们需要根据 $resourceOwnerName 参数 进行分别处理。在这里我将查找和存库在一个方法处理了,见 findUserByWeiBo(UserResponseInterface $response),具体想要存什么数据,你可以根据自己业务来处理 接口返回的原始数据可通过 $response->getResponse() 方法获得。当查找不到用户时一定要抛出 AccountNotLinkedException 异常,以使 HWI\Bundle\OAuthBundle\Controller\ConnectController 控制器的 connectAction 方法来处理。至此第三方用户数据存库就处理完成了。

  接下来便是你的绑定业务流程实现。我们新建控制器 ConnectController 并继承自HWI\Bundle\OAuthBundle\Controller\ConnectController,覆写其中registerAction 方法以实现我们自己的注册。

use HWI\Bundle\OAuthBundle\Controller\ConnectController as HwiConnectController;class ConnectController extends HwiConnectController
{
/*** Shows a registration form if there is no user logged in and connecting* is enabled.** @param Request $request a request* @param string  $key     key used for retrieving the right information for the registration form** @return Response** @throws NotFoundHttpException if `connect` functionality was not enabled* @throws AccessDeniedException if any user is authenticated* @throws \Exception*/public function registrationAction(Request $request, $key){$connect = $this->container->getParameter('hwi_oauth.connect');if (!$connect) {throw new NotFoundHttpException();}$hasUser = $this->isGranted('IS_AUTHENTICATED_REMEMBERED');if ($hasUser) {throw new AccessDeniedException('Cannot connect already registered account.');}$session = $request->getSession();$error = $session->get('_hwi_oauth.registration_error.'.$key);$session->remove('_hwi_oauth.registration_error.'.$key);if (!$error instanceof AccountNotLinkedException || time() - $key > 300) {// todo: fix thisthrow new \Exception('Cannot register an account.', 0, $error instanceof \Exception ? $error : null);}$userInformation = $this->getResourceOwnerByName($error->getResourceOwnerName())->getUserInformation($error->getRawToken());// 创建注册form// 处理POST请求并登录// reset the error in the session$key = time();$session->set('_hwi_oauth.registration_error.'.$key, $error);return $this->render('HWIOAuthBundle:Connect:registration.html.'.$this->getTemplatingEngine(), array('key' => $key,'form' => $form->createView(),'userInformation' => $userInformation,));}
}

最后就是修改配置啦。具体参考官方文档,记住用户提供程序改成我们自己的哦!

转载于:https://www.cnblogs.com/mickeyooo/p/9547666.html

Symfony 使用 hwi/oauth-bundle 实现第三方登录相关推荐

  1. 用 Flask 来写个轻博客 (23) — 应用 OAuth 来实现 Facebook 第三方登录

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 第三方登录流程 OAuth 应用 OAuth 实现 Face ...

  2. Spring Boot 快速集成第三方登录功能

    Spring Boot 快速集成第三方登录功能 前言 此 demo 主要演示 Spring Boot 项目如何使用 史上最全的第三方登录工具 - JustAuth 实现第三方登录,包括 QQ 登录.G ...

  3. 单点登录和第三方登录

    最近做了一些登录相关的工作,顺便看了下常见的登录方案,这里主要从后端的角度梳理一些技术细节. 文章目录 单点登录 第三方登录 单点登录 单点登录(Single Sign On),简称SSO,是目前比较 ...

  4. OAuth认证原理与第三方登录

    1.背景 以下例子引用知乎"OAuth 授权的工作原理是怎样的?足够安全吗?"中李天放的回答 假如你在某个网站A上使用微博进行第三方登录,那么你可以想象新浪微博就是你的家.偶尔你会 ...

  5. 第三方登录----OAuth与OpenID

    现在很多网站都可以用第三方的账号登陆,比如,现在我要登录淘宝买东西,而如果我没有淘宝的账号,我也可以用微博的账号登录,这个微博账号就是第三方账号了.这个三方登录的实现主要包含OpenID和OAuth技 ...

  6. Cookie + Session登录-Token登录-SSO 单点登录-OAuth 第三方登录

    文章目录 1.Cookie + Session 登录 2. Cookie + Session 存在的问题 3.Token 登录认证 1. Token 机制实现流程 2. Token 机制的特点 3. ...

  7. sdk没有登录什么意思_不需要接入SDK的第三方登录及分享

    讲到第三方登录分享,第一反应大概就是友盟.ShareSDK之类.集成微信.QQ.微博三个平台的话,友盟的SDK有62.9M,ShareSDK的包有74M.如果直接集成最原始的三个平台的SDK,大小总共 ...

  8. 实现QQ的第三方登录 iOS开发

    现在大多数App在登录时候都会有第三方登录,如QQ,微信,微博等,如下面的截图 下面我们主要讲一下qq的第三方登陆如何实现 首先,到官网注册: 一,下载SDK 下载SDK 地址:http://wiki ...

  9. (0013)iOS 开发之集成友盟第三方登录

    第三方登录的原理和流程 用户采用第三方登录的时候,用户会发送哪些信息到我的后台,后台会进行哪些比对操作?首次使用第三方登录和再次使用第三方登录时验证有哪些不同,后台如何保存用户的登录信息尼? 对于用户 ...

最新文章

  1. 一文讲清,MySQL的执行计划
  2. 报复性降薪潮来袭,怎么应对?
  3. Android命令行工具logcat详细用法!
  4. JavaScript学习笔记之数组(二)
  5. [编程题]数字分类 (20)
  6. boost::detail::allocator模块的测试程序
  7. 使用 Rxjs 解决 Angular Component 之间的通信问题
  8. 为什么大学感觉学编程很难?原因有这三点。
  9. java类的实现程序_java – 如何在另一个类中实现处理程序?
  10. SpringBoot--实战开发--整合SSL
  11. Android之GPU过度绘制与图形渲染优化
  12. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)4.2——增加自定义task
  13. 3D打印gcode命令大全及解析
  14. c语言pow函数原型_c语言pow的用法
  15. MacBook Air装单独win7
  16. 人工智能相关书籍介绍
  17. 层次状态机-HSM代码解析
  18. Linux服务器中Tomcat在执行./Shutdown.sh的时候报错
  19. UML中关系(4+4)
  20. html5调用手电筒,HTML5的模拟手电筒照明效果

热门文章

  1. @程序员,第一批00后开始报考AI专业了
  2. TensorFlow快餐教程:程序员快速入门深度学习五步法
  3. 蓝绿发布、滚动发布、灰度发布,有什么区别?这下明白了
  4. Java 常用代码汇总
  5. 深度对比Jackson和Fastjson,最终我还是选择了...
  6. 服务不可用怎么排查?讲了100遍还是记不住?
  7. 4 种数据库缓存最终一致性的优缺点对比?最终选择方案四!
  8. 几种常用 JSON 库性能比较
  9. 10篇顶会paper,入选微软学者,上海交大吴齐天的科研思考!
  10. 为了一个科研idea,博士生们连冥想、巫毒仪式都用上了