Symfony 使用 hwi/oauth-bundle 实现第三方登录
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 实现第三方登录相关推荐
- 用 Flask 来写个轻博客 (23) — 应用 OAuth 来实现 Facebook 第三方登录
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 第三方登录流程 OAuth 应用 OAuth 实现 Face ...
- Spring Boot 快速集成第三方登录功能
Spring Boot 快速集成第三方登录功能 前言 此 demo 主要演示 Spring Boot 项目如何使用 史上最全的第三方登录工具 - JustAuth 实现第三方登录,包括 QQ 登录.G ...
- 单点登录和第三方登录
最近做了一些登录相关的工作,顺便看了下常见的登录方案,这里主要从后端的角度梳理一些技术细节. 文章目录 单点登录 第三方登录 单点登录 单点登录(Single Sign On),简称SSO,是目前比较 ...
- OAuth认证原理与第三方登录
1.背景 以下例子引用知乎"OAuth 授权的工作原理是怎样的?足够安全吗?"中李天放的回答 假如你在某个网站A上使用微博进行第三方登录,那么你可以想象新浪微博就是你的家.偶尔你会 ...
- 第三方登录----OAuth与OpenID
现在很多网站都可以用第三方的账号登陆,比如,现在我要登录淘宝买东西,而如果我没有淘宝的账号,我也可以用微博的账号登录,这个微博账号就是第三方账号了.这个三方登录的实现主要包含OpenID和OAuth技 ...
- Cookie + Session登录-Token登录-SSO 单点登录-OAuth 第三方登录
文章目录 1.Cookie + Session 登录 2. Cookie + Session 存在的问题 3.Token 登录认证 1. Token 机制实现流程 2. Token 机制的特点 3. ...
- sdk没有登录什么意思_不需要接入SDK的第三方登录及分享
讲到第三方登录分享,第一反应大概就是友盟.ShareSDK之类.集成微信.QQ.微博三个平台的话,友盟的SDK有62.9M,ShareSDK的包有74M.如果直接集成最原始的三个平台的SDK,大小总共 ...
- 实现QQ的第三方登录 iOS开发
现在大多数App在登录时候都会有第三方登录,如QQ,微信,微博等,如下面的截图 下面我们主要讲一下qq的第三方登陆如何实现 首先,到官网注册: 一,下载SDK 下载SDK 地址:http://wiki ...
- (0013)iOS 开发之集成友盟第三方登录
第三方登录的原理和流程 用户采用第三方登录的时候,用户会发送哪些信息到我的后台,后台会进行哪些比对操作?首次使用第三方登录和再次使用第三方登录时验证有哪些不同,后台如何保存用户的登录信息尼? 对于用户 ...
最新文章
- 一文讲清,MySQL的执行计划
- 报复性降薪潮来袭,怎么应对?
- Android命令行工具logcat详细用法!
- JavaScript学习笔记之数组(二)
- [编程题]数字分类 (20)
- boost::detail::allocator模块的测试程序
- 使用 Rxjs 解决 Angular Component 之间的通信问题
- 为什么大学感觉学编程很难?原因有这三点。
- java类的实现程序_java – 如何在另一个类中实现处理程序?
- SpringBoot--实战开发--整合SSL
- Android之GPU过度绘制与图形渲染优化
- Android开发:《Gradle Recipes for Android》阅读笔记(翻译)4.2——增加自定义task
- 3D打印gcode命令大全及解析
- c语言pow函数原型_c语言pow的用法
- MacBook Air装单独win7
- 人工智能相关书籍介绍
- 层次状态机-HSM代码解析
- Linux服务器中Tomcat在执行./Shutdown.sh的时候报错
- UML中关系(4+4)
- html5调用手电筒,HTML5的模拟手电筒照明效果