adamwathan/ eloquent-oauth-l5
Laravel 和 Eloquent 的简单 OAuth 认证
Requires
- php: >=5.5.0
- adamwathan/eloquent-oauth: ~8.1
- guzzlehttp/guzzle: ^6.2.1
Requires (Dev)
- phpunit/phpunit: ^4.8
This package is not auto-updated.
Last update: 2022-02-01 12:47:34 UTC
README
重要:此包不再积极维护。 对于错误修复和新功能,请进行分支。
Eloquent OAuth L5
注意:如果您使用 Laravel 4,请使用 Laravel 4 包。
Eloquent OAuth 是一个为 Laravel 5 设计的包,旨在使针对各种 OAuth 提供商的认证变得极其简单。在配置文件中指定您的客户端 ID 和密钥,运行迁移,然后只需两次方法调用,您就有 OAuth 集成。
视频教程
基本示例
// Redirect to Facebook for authorization Route::get('facebook/authorize', function() { return SocialAuth::authorize('facebook'); }); // Facebook redirects here after authorization Route::get('facebook/login', function() { // Automatically log in existing users // or create a new user if necessary. SocialAuth::login('facebook'); // Current user is now available via Auth facade $user = Auth::user(); return Redirect::intended(); });
支持的提供商
- GitHub
- Soundcloud
如果您希望支持特定提供商,请随意提交问题,或者更好的是,提交一个拉取请求。
安装
使用 Composer 添加此包
在您的项目目录中,只需从命令行输入
composer require adamwathan/eloquent-oauth-l5
更新您的配置
将服务提供者添加到 config/app.php
中的 providers
数组
'providers' => [ // ... AdamWathan\EloquentOAuthL5\EloquentOAuthServiceProvider::class, // ... ]
将外观添加到 config/app.php
中的 aliases
数组
'aliases' => [ // ... 'SocialAuth' => AdamWathan\EloquentOAuth\Facades\OAuth::class, // ... ]
发布包配置
通过运行提供的控制台命令发布配置文件和迁移
php artisan eloquent-oauth:install
接下来,重新迁移您的数据库
php artisan migrate
如果您需要更改用于存储 OAuth 身份的表的名称,您可以在
eloquent-oauth
配置文件中这样做。
配置提供商
在 config/eloquent-oauth.php
中更新您正在使用的提供商的应用信息
'providers' => [ 'facebook' => [ 'client_id' => '12345678', 'client_secret' => 'y0ur53cr374ppk3y', 'redirect_uri' => 'https://example.com/facebook/login'), 'scope' => [], ] ]
每个提供商都预先配置了获取基本用户信息和用户电子邮件地址所需的范围,因此范围数组通常可以留空,除非您需要特定的附加权限。请参阅提供商的 API 文档以了解各种服务可用的权限。
完成!
Eloquent OAuth 设计为与 Laravel 的 Eloquent 认证驱动程序集成,因此请确保您在
app/config/auth.php
中使用eloquent
驱动程序。您可以根据需要定义实际的User
模型,并添加所需的行为,只需确保在app/config/auth.php
中使用其完全限定的命名空间指定您正在使用的模型。
自定义提供商
如果您想注册一个不支持默认配置的服务提供者,您可以通过在您的 config/eloquent-oauth.php
文件中首先指定该提供者所需的配置来完成此操作。
// config/eloquent-oauth.php return [ 'model' => User::class, 'table' => 'oauth_identities', 'providers' => [ 'facebook' => [ /* ... */], 'google' => [ /* ... */], 'gumroad' => [ 'client_id' => env('GUMROAD_CLIENT_ID'), 'client_secret' => env('GUMROAD_CLIENT_SECRET'), 'redirect_uri' => env('GUMROAD_REDIRECT_URI'), 'scope' => ['view_sales'], ], ], ];
然后通过扩展 EloquentOAuthServiceProvider
并用您自己的实现来映射提供者名称到提供者类,指定应使用哪个类来处理该提供者。
class MySocialAuthServiceProvider extends EloquentOAuthServiceProvider { protected function getProviderLookup() { // Merge the default providers if you like, or override entirely // to skip loading those providers completely. return array_merge($this->providerLookup, [ 'gumroad' => GumroadProvider::class ]); } }
请记住,在
config/app.php
中使用您对提供者的扩展,而不是使用包提供的提供者。
如果您的提供者遵循默认提供者使用的相同 __construct($config, $httpClient, $request)
参数签名,那么您就完成了。
如果不是这样,请确保在另一个提供者中将您的提供者绑定到 IOC 容器中,并且该包将确保从容器中获取实现,而不是尝试自行构造它。
要了解提供者是如何工作的,请查看包装提供者的实现方式。
- https://github.com/adamwathan/socialnorm-google
- https://github.com/adamwathan/socialnorm-github
- https://github.com/adamwathan/socialnorm-instagram
- https://github.com/adamwathan/socialnorm-soundcloud
- https://github.com/adamwathan/socialnorm-facebook
- https://github.com/adamwathan/socialnorm-linkedin
用法
对 OAuth 提供者的身份验证是一个多步骤的过程,但我已尽可能简化它。
使用提供者授权
首先,您需要定义授权路由。这是您的“登录”按钮将指向的路由,该路由将用户重定向到提供者的域以授权您的应用程序。授权后,提供者将用户重定向回您的第二个路由,该路由处理身份验证过程的其余部分。
要授权用户,只需从路由中直接返回 SocialAuth::authorize()
方法。
Route::get('facebook/authorize', function() { return SocialAuth::authorize('facebook'); });
在您的应用程序中验证
接下来,您需要定义一个路由,以便使用提供者返回的详细信息对您的应用程序进行身份验证。
对于基本案例,您可以直接使用 SocialAuth::login()
并提供您正在验证的提供者名称。如果用户拒绝了您的应用程序,此方法将抛出 ApplicationRejectedException
异常,您可以捕获并按需处理。
login
方法将在必要时创建新用户,或者如果用户之前已经使用过您的应用程序,则更新现有用户。
一旦 login
方法成功,用户将经过身份验证,并通过 Auth::user()
可用,就像他们通过您的应用程序正常登录一样。
use SocialNorm\Exceptions\ApplicationRejectedException; use SocialNorm\Exceptions\InvalidAuthorizationCodeException; Route::get('facebook/login', function() { try { SocialAuth::login('facebook'); } catch (ApplicationRejectedException $e) { // User rejected application } catch (InvalidAuthorizationCodeException $e) { // Authorization was attempted with invalid // code,likely forgery attempt } // Current user is now available via Auth facade $user = Auth::user(); return Redirect::intended(); });
如果您需要对新创建的用户进行任何操作,可以将一个可选的闭包作为第二个参数传递给 login
方法。此闭包将接收 $user
实例和一个 ProviderUserDetails
对象,该对象包含来自 OAuth 提供者的基本信息,包括
- 用户 ID
- 昵称
- 全名
- 电子邮件
- 头像 URL
- 访问令牌
SocialAuth::login('facebook', function($user, $details) { $user->nickname = $details->nickname; $user->name = $details->full_name; $user->profile_image = $details->avatar; $user->save(); });
注意:Instagram 和 Soundcloud API 不允许您检索用户的电子邮件地址,因此不幸的是,对于这些提供者,该字段始终为
null
。
高级:存储额外的数据
记住:Eloquent OAuth 包的一个目标是对所有支持的提供者接收到的数据进行规范化,以确保您可以在 $details
对象中依赖特定的数据项(如上所述)。
但是,每个提供者都提供了自己的额外数据集。如果您需要访问或存储 Eloquent OAuth 默认 ProviderUserDetails
对象提供的超出基本数据之外的数据,您需要做两件事
-
从提供者那里请求它,通过扩展其作用域
例如,我们希望在用户使用Facebook登录时收集用户的性别。
在
config/eloquent-oauth.php
文件中,将facebook
提供者部分的[scope]
设置为包括public_profile
权限范围,如下所示'scope' => ['public_profile'],
有关每个提供者可用的权限范围,请查阅该提供者的API文档。
注意:通过增加权限范围,您将要求用户授予访问更多信息的权限。用户将被通知您请求的权限范围。如果您请求过多不必要的数据,他们可能会拒绝。因此,在请求额外权限范围时,请务必谨慎。
- 现在,在您执行
SocialAuth::login
的地方,通过访问$details->raw()['KEY']
将数据存储到您的$user
对象中
SocialAuth::login('facebook', function($user, $details) ( $user->gender = $details->raw()['gender']; $user->save(); });
提示:您可以通过在该闭包中测试
dd($details->raw());
来查看可用的键。