mxmz / lfj-opauth
LfjOpauth 是一个 Zend Framework 2 模块,通过 Opauth 框架支持许多身份验证提供者。
Requires
- php: >=5.3
- opauth/opauth: 0.4.4
Suggests
- opauth/facebook: Allows Facebook authentication
- opauth/google: Allows Google authentication
- opauth/twitter: Allows Twitter authentication
This package is not auto-updated.
Last update: 2024-09-14 18:20:36 UTC
README
最初由 Lorenzo Ferrara Junior 创建,由 Maksim Luzik (mxmz-) 分支
简介
LfjOpauth 是一个 Zend Framework 2 模块,通过 Opauth 框架支持许多身份验证提供者。
安装
要使用此模块,您需要
- 使用
composer
安装 LfjOpauth 模块 - 至少安装一种 Opauth 策略
- 启用 LfjOpauth 模块
要安装 LfjOpauth 模块,您需要在项目的 composer.json
文件的 require
列表中添加 "mxmz/lfj-opauth": "dev-master"
要安装 Opauth 策略,您需要在 Packagist 或 GitHub 上查找所需的软件包,并将其添加到项目的 composer.json
文件的 require
列表中。
以下是一个修改后的 composer.json
示例,其中包含 LfjOpauth 模块和 Facebook 策略
{ "name": "zendframework/skeleton-application", "description": "Skeleton Application for ZF2", "require": { "php": ">=5.3.3", "zendframework/zendframework": ">2.2.0rc1", "mxmz/lfj-opauth": "dev-master", "opauth/facebook": "0.2.1" } }
示例中包含 Facebook Opauth 策略的安装。有关 Opauth 策略的更多信息可以在 GitHub 上找到
使用 composer
安装 LfjOpauth 时,Opauth 依赖项会自动解决,但您仍必须提供至少一个策略。
接下来,您需要将 LfjOpauth
添加到您的 Zend Framework 2 项目的 config/application.config.php
文件中的 modules
列表中。
以下是一个示例
<?php return array( 'modules' => array( 'LfjOpauth', 'Application', ), // more code );
配置
安装 LfjOpauth 后,您必须在 config/autoload
目录中创建一个名为 lfjopauth.global.php
的文件。这是您指定 LfjOpauth 选项的配置文件。
lfjopauth.global.php
文件的示例
$settings = array( 'security_salt' => 'Some random text', 'Strategy' => array( 'Facebook' => array( 'app_id' => 'facebook application id', 'app_secret' => 'facebook application secret', 'scope' => 'email,user_relationships', ), 'second_facebook_app' => array( 'app_id' => 'another facebook application id', 'app_secret' => 'another facebook application secret', 'scope' => 'email,user_relationships', 'strategy_class' => 'Facebook', 'strategy_url_name' => 'second_facebook_app' ) ), 'check_controller_enabled' => false ); return array('lfjopauth' => $settings);
配置几乎与 Opauth 配置 相同,但没有处理 path
和 callback_url
选项,这些由模块处理。
启用或禁用对 CheckController
的访问的 check_controller_enabled
标志。
或者,可以使用 Service Manager
设置选项提供者以替换当前配置加载器。为此,您只需
- 注册一个名为
lfjopauth_module_options
的服务 - 实现接口
LfjOpauth\Provider\OptionsProviderInterface
- 并返回如上所示的配置
array
如果要从数据库加载配置或为复杂情况生成配置,这将非常有用。
登录和回调 URL
根据上述配置(以及相应的 Facebook 应用程序),您将能够使用以下方式登录
- http://example.com/user/opauth/login/facebook
- http://example.com/user/opauth/login/second_facebook_app
并使用以下方式登出
对于示例配置中描述的两个演示 Facebook 应用程序,您应使用
作为 具有 Facebook 登录的网站,网站 URL 选项的值。
事件
在回调处理完毕后,LfjOpauth\Service\OpauthService
触发 LfjOpauth\LfjOpauthEvent::EVENT_LOGIN_CALLBACK
事件。请注意,即使登录过程失败,也会始终触发 LfjOpauth\LfjOpauthEvent::EVENT_LOGIN_CALLBACK
事件。使用可用的事件参数以实现结果检查。
事件包含三个参数
authenticationService
:一个Zend\Authentication\Result
实例authenticationResult
:一个Zend\Authentication\AuthenticationService
实例provider
:是尝试登录时使用的提供者(例如:facebook,google)
其目标是LfjOpauth\Service\OpauthService
的实例。
关于如何连接到事件的示例,请参考以下代码。
namespace Application; use Zend\EventManager\EventInterface; use Zend\Mvc\ModuleRouteListener; use Zend\Mvc\MvcEvent; class Module { public function onBootstrap(MvcEvent $e) { $eventManager = $e->getApplication()->getEventManager(); $moduleRouteListener = new ModuleRouteListener(); $moduleRouteListener->attach($eventManager); $sharedEventManager = $eventManager->getSharedManager(); $sharedEventManager->attach('LfjOpauth\Service\OpauthService', \LfjOpauth\LfjOpauthEvent::EVENT_LOGIN_CALLBACK, function(EventInterface $e) { /** @var \Zend\Authentication\Result $result */ $authenticationResult = $e->getParam('authenticationResult'); /** @var \Zend\Authentication\AuthenticationService $authenticationService */ $authenticationService = $e->getParam('authenticationService'); /** @var \LfjOpauth\Service\OpauthService $target */ $target = $e->getTarget(); $provider = $e->getParam('provider'); /* var_dump(get_class($e->getTarget())); var_dump($e->getParam('provider')); var_dump('$authenticationResult->isValid()', $authenticationResult->isValid()); var_dump('$authenticationService->hasIdentity()', $authenticationService->hasIdentity()); var_dump('$authenticationService->getIdentity()', $authenticationService->getIdentity()); var_dump('$authenticationResult->getCode()', $authenticationResult->getCode()); var_dump('$authenticationResult->getIdentity()', $authenticationResult->getIdentity()); var_dump('$authenticationResult->getMessages()', $authenticationResult->getMessages()); */ }, 100); }
自定义回调URL
如果您需要自定义登录和/或回调URL(例如包含更多参数),您可以编写自定义路由和控制器。
这是定义custom_lfjopauth_login
和custom_lfjopauth_callback
路由的代码(custom-auth
是控制器别名)
return array( 'router' => array( 'routes' => array( 'custom_lfjopauth_login' => array( 'type' => 'Segment', 'options' => array( 'route' => '/custom/login/[:provider[/:oauth_callback]]', 'constraints' => array( 'provider' => '[a-zA-Z][a-zA-Z0-9_-]*', 'oauth_callback' => '[a-zA-Z][a-zA-Z0-9_-]*' ), 'defaults' => array( 'controller' => 'custom-auth', 'action' => 'redirectAndReturn' ) ) ), 'custom_lfjopauth_callback' => array( 'type' => 'Segment', 'options' => array( 'route' => '/custom/callback/[:provider]', 'constraints' => array( 'provider' => '[a-zA-Z][a-zA-Z0-9_-]*' ), 'defaults' => array( 'controller' => 'custom-auth', 'action' => 'callback' ) ) ), // more code ) ) );
这是管理登录和回调操作的假设控制器代码
// [...] class AuthController extends AbstractActionController { public function redirectAndReturnAction() { // if user is not logged in if (!$this->auth()->hasIdentity()) { $provider = $this->params()->fromRoute('provider'); $oauth_callback = $this->params()->fromRoute('oauth_callback'); $opauth_service = $this->getServiceLocator()->get('opauth_service'); // set custom login and callback routes $opauth_service->setLoginUrlName('custom_lfjopauth_login'); $opauth_service->setCallbackUrlName('custom_lfjopauth_callback'); return $opauth_service->redirect($provider, $oauth_callback); } return $this->redirect()->toRoute('somewhere_over_the_rainbow'); } public function callbackAction() { // if user is not logged in if (!$this->auth()->hasIdentity()) { $provider = $this->params()->fromRoute('provider'); $opauth_service = $this->getServiceLocator()->get('opauth_service'); // set custom login and callback routes $opauth_service->setLoginUrlName('custom_lfjopauth_login'); $opauth_service->setCallbackUrlName('custom_lfjopauth_callback'); $opauth_service->callback($provider); } return $this->redirect()->toRoute('somewhere_else_over_the_rainbow'); } }
检查登录状态
如果启用了check_controller_enabled
标志,您可以在该URL打印当前会话信息
check_controller_enabled
的默认值是false
。
其他信息
LfjOpauth使用Zend\Authentication\AuthenticationService
(别名lfjopauth_auth_service
)来管理身份验证。
LfjOpauth\Service\OpauthService
(别名:opauth_service
)类公开了redirect
和callback
方法,可以在任何控制器中使用。一个示例可以在LfjOpauth\Controller\LoginController类中找到。
许可证
本存档中的文件是在MIT许可证下发布的。您可以在LICENSE.txt中找到此许可证的副本。