stavarengo / o-auth-connect
使用 Zend Framework 2 (ZF2) 连接 OAuth2 服务的最简单方法
Requires
- php: ^5.5|~7.0
- stavarengo/sta-commons: ^0.0
- zendframework/zend-mvc: ^2.5|^3.0
README
OAuthConnect 是一个 ZF2/ZF3 库,为您的应用程序添加“用 Facebook、Google 等登录”的功能。
它是一个小巧的 ZF2 模块,您可以使用 composer 需求它。它不会自动安装任何第三方 OAuth 库,因此您可以自由安装您想要使用的服务的 OAuth 库,o-auth-connect 将会检测到。
例如。假设您想为您的网站添加“通过 Facebook 登录”的功能。为了做到这一点,您只需要安装 o-auth-connect,然后安装 Facebook PHP SDK。这样,您只需安装您将要使用的库。
安装
- 执行
composer require stavarengo/o-auth-connect:^0.0
- 安装您想要使用的 OAuth 服务的所有库。请参阅 支持的服务列表。
使用方法
首要之事:概念!
越简单越好。使用 OAuthConnect,您只需处理两个 URL,而不是担心每个 OAuth 服务暴露的 URL 终端,当请求某人的授权时与您交互。
sta/oAuthConnect/ask/:oAuthService
:此路由是您在请求用户授权时必须发送用户的位置。此路由渲染一个类似这样的 URL:/sta/o-auth-connect/facebook
。sta/oAuthConnect/response
:OAuth 服务将用户授权响应重定向到此位置。大多数 OAuth 服务要求一个 重定向回调 URL。这是您的站点中的一个 URL,准备接收用户的授权响应(如果用户允许或拒绝您的请求)。OAuthConnect 会为您处理响应,因此每次您设置 OAuth 服务账户并要求您设置类似于“您的重定向 URL 是什么?”的内容时,您必须设置<your_host>/sta/o-auth-connect/response
。稍后在这个文件中,您将看到如何监听这个响应。
通过示例学习
让我们通过一个示例来看看它是如何工作的。在这个示例中,我们将向我们的网站添加“通过 Facebook 登录”和“通过 Google 登录”功能。
通过示例学习:显示登录链接
首先,您需要添加指向“通过 Facebook 登录”和“通过 Google 登录”的链接。这些链接将指向路由 sta/oAuthConnect/ask/:oAuthService
。因此,将下面的代码放入一个 Zend View(phtml 文件)中,该文件将打印出链接(注意:此代码将失败!如果您急于完成,请跳到这里,否则,请继续阅读以了解为什么会失败)。
<?php $routeToRedirectAfterResponse = [ 'route' => 'homePage', ]; $facebookHref = $this->url( 'sta/oAuthConnect/ask', [ 'oAuthService' => 'facebook', ], [ 'query' => [ 'redirectAfterResponse' => $routeToRedirectAfterResponse, ], ] ); $googleHref = $this->url( 'sta/oAuthConnect/ask', [ 'oAuthService' => 'google', ], [ 'query' => [ 'scopes' => [ \Google_Service_YouTube::YOUTUBE, ], 'redirectAfterResponse' => $routeToRedirectAfterResponse, ], ] ); ?> <a href="<?php echo $facebookHref ?>">Login with Facebook</a> - <a href="<?php echo $googleHref ?>">Login with Goolge</a>
这将打印出一个链接,将用户发送到 OAuth 服务(在这种情况下,Facebook)询问用户是否同意与我们分享其 Facebook 信息的地方。注意参数 oAuthService
。您必须使用此参数来设置您想要使用的服务的名称。
让我们更深入地了解一下这个 phtml
文件中正在发生的事情。
- 我们正在创建两个 URL:一个允许用户通过 Facebook 登录,另一个通过 Google 登录。
- 这两个URL指向相同的路由,每个都是
sta/oAuthConnect/ask
。需要注意的是,无论何时您想允许用户使用OAuth分享信息,您都应始终使用此路由来生成链接。 - 我们传递了一个名为
redirectAfterResponse
的查询参数。使用此参数来告知用户允许或拒绝后我们应去哪里。参数redirectAfterResponse
是一个数组
,它接收您要传递给方法\Zend\Mvc\Controller\Plugin\Redirect::toRoute()
的相同参数。换句话说,redirectAfterResponse
是一个可以接收三个条目的数组:route
- 路由名称(必需);params
- 您的路由参数(例如:当您使用分段路由时);options
- 其他路由选项(例如:查询参数)。 - 谷歌要求您始终指定所需的作用域(Facebook不需要),因此我们在创建用于谷歌登录的URL时传递了一个名为
scopes
的查询参数。参数scopes
是一个包含所需询问的作用域的字符串
数组。
注意:将路由信息传递给
redirectAfterResponse
参数而不是URL,可以使您的网站更安全,因为它将避免其他恶意脚本冒充您请求用户分享他们的信息。
注意:如果您不想通过查询参数暴露您的路由,请阅读它以了解如何操作。
通过示例学习:执行和测试
如果您现在执行此代码并点击其中一个链接,您将收到一个错误 Zend\ServiceManager\Exception\ServiceNotCreatedException
,其中附带有一些之前的异常。查看附加的先前异常,您将找到异常 Sta\OAuthConnect\Exception\MissingConfiguration
,表示配置 $config[\Sta\OAuthConnect\ConfigProvider::class]['o-auth-services']['facebook']['appId']
未找到。
这是因为我们需要配置我们所需使用的所有服务的凭据。每个服务都有不同的方法来声明其凭据,但您不必担心这一点:OAuthConnect 总会告诉您缺少什么以及确切的位置应该设置它。因此,让我们添加我们的凭据以使用谷歌和Facebook OAuth服务。
注意:您可以在每个服务的源文件中查看每个服务接受的配置选项。因此,如果您想了解更多信息,请查看这里的文件。
将其添加到您的 config/autoload/global.php
配置文件中。
\Sta\OAuthConnect\ConfigProvider::class => [ 'o-auth-services' => [ 'facebook' => [ 'appId' => 'YOUR_APP_ID', 'appSecret' => 'YOUR_APP_SECRET', ], 'google' => [ 'clientId' => '...', 'clientSecret' => '...', ], ], ],
通过示例学习:完成
您现在可以开始了。访问您的网站并点击 phtml
文件打印出的一个链接。您将被重定向到OAuth服务网站,该网站将要求您进行授权。继续:授权它,然后您将被重定向回您的网站。请注意,您被重定向回您在参数 redirectAfterResponse
中设置的地址。如果您没有设置参数 redirectAfterResponse
,则您将看到一个消息:“您现在可以关闭此窗口”(有关此消息的更多信息请在此处)。
为了避免消息“您现在可以关闭此窗口”,您必须告诉OAuthConnect响应后应去哪里。因此,更改您的
监听授权响应
支持的OAuth服务
添加对其他OAuth库的支持
如果您需要使用o-auth-connect尚不支持的其他OAuth服务,您只需做以下操作:
- 创建一个实现\Sta\OAuthConnect\OAuthService\OAuthServiceInterface接口的类。
- 请使用配置文件将此类添加到OAuthConnect中,如下所示
\Sta\OAuthConnect\ConfigProvider::class => [ 'custom-services' => [ 'Your\New\Facy\OAuthServiceClass' ], ];
字符串Your\New\Facy\OAuthServiceClass
可以是类名或服务工厂名称,它将通过ZF [ServiceManager](zendframework.github.io/zend-servicemanager)
创建。OAuthConnect将自动检测您是否打算使用ServiceManager。
隐藏路由从查询参数中
待办事项:此部分仍在建设中
异步授权:在不离开您网站的情况下进行询问
待办事项:此部分仍在建设中
注意:OAuthConnect中的所有字符串都使用Zend Translator进行翻译。有关更多信息,请在此处查看。
翻译消息
待办事项:此部分仍在建设中
OAuthConnect向用户打印了一些(实际上很少)字符串。默认情况下,所有字符串都是用英语编写的。OAuthConnect还将这些字符串翻译成几种其他语言。您可以在此处检查您的语言是否已翻译。即使尚未翻译成您的语言,您也可以通过以下步骤自行翻译。
注意:通过发送您的翻译作为pull request来帮助我们项目成长。