adamwathan / eloquent-oauth
使用Laravel和Eloquent实现的愚蠢简单的OAuth身份验证
Requires
- php: >=5.5.0
- illuminate/auth: 4.*|5.*
- illuminate/database: 4.*|5.*
- illuminate/http: 4.*|5.*
- illuminate/routing: 4.*|5.*
- illuminate/session: 4.*|5.*
- illuminate/support: 4.*|5.*
- socialnorm/facebook: ^0.2
- socialnorm/github: ^0.2
- socialnorm/google: ^0.2
- socialnorm/instagram: ^0.2
- socialnorm/linkedin: ^0.2
- socialnorm/socialnorm: ^0.2
- socialnorm/soundcloud: ^0.2
Requires (Dev)
- mockery/mockery: ~0.9
- phpunit/phpunit: ^4.8
README
重要:此包不再积极维护。 对于错误修复和新功能,请进行分支。
Eloquent OAuth
- 使用Laravel 4包装器轻松集成Laravel 4。
- 使用Laravel 5包装器轻松集成Laravel 5。
Eloquent OAuth是为Laravel设计的包,旨在使对各种OAuth提供商进行身份验证变得极其简单。在配置文件中指定您的客户端ID和密钥,运行迁移后,就只需调用两个方法即可完成OAuth集成。
视频教程
基本示例
// Redirect to Facebook for authorization Route::get('facebook/authorize', function() { return OAuth::authorize('facebook'); }); // Facebook redirects here after authorization Route::get('facebook/login', function() { // Automatically log in existing users // or create a new user if necessary. OAuth::login('facebook'); // Current user is now available via Auth facade $user = Auth::user(); return Redirect::intended(); });
支持的提供商
- GitHub
- SoundCloud
如果您想支持特定的提供商,请随时打开问题,或者更好的是,提交一个拉取请求。
安装
请检查适用于您的Laravel版本的安装说明的相应包装器包。
使用方法
针对OAuth提供商的身份验证是一个多步骤的过程,但我已经尽可能地简化了它。
与提供商进行授权
首先,您需要定义授权路由。这是“登录”按钮指向的路由,该路由将用户重定向到提供商的域以授权您的应用程序。授权后,提供商将用户重定向回您的第二个路由,该路由处理身份验证过程的其余部分。
要授权用户,只需从路由中直接返回OAuth::authorize()
方法。
Route::get('facebook/authorize', function() { return OAuth::authorize('facebook'); });
在您的应用程序中进行身份验证
接下来,您需要定义一个路由,用于使用提供商返回的详细信息对您的应用程序进行身份验证。
对于基本案例,您可以直接调用带有您要验证的提供商名称的OAuth::login()
。如果用户拒绝了您的应用程序,则此方法将抛出ApplicationRejectedException
,您可以捕获并按需处理。
如果需要,login
方法将创建新用户,或者如果用户以前已使用过您的应用程序,则更新现有用户。
一旦login
方法成功,用户将被身份验证,并通过Auth::user()
可用,就像他们通常通过您的应用程序登录一样。
use SocialNorm\Exceptions\ApplicationRejectedException; use SocialNorm\Exceptions\InvalidAuthorizationCodeException; Route::get('facebook/login', function() { try { OAuth::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
实例和一个包含 OAuth 提供者基本信息的 SocialNorm\User
对象,包括
id
昵称
全名
头像
电子邮件
访问令牌
OAuth::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' => ['email', 'public_profile'],
有关每个提供者的可用作用域,请参阅该提供者的 API 文档。
注意:通过增加作用域,您将要求用户授予访问额外信息的权限。他们将会被告知您请求的作用域。如果您请求过多的不必要数据,他们可能会拒绝。因此,在请求额外作用域时要谨慎。
- 现在,在您执行
OAuth::login
的地方,通过访问$details->raw()['KEY']
数据将其存储到您的$user
对象中
OAuth::login('facebook', function($user, $details) ( $user->gender = $details->raw()['gender']; // Or whatever the key is $user->save(); });
提示:您可以通过在该闭包内使用
dd($details->raw());
来测试可用的键。