metrakit/extended-eloquent-oauth

使用Laravel和Eloquent的简单OAuth认证

v5.0.1 2015-03-23 12:46 UTC

README

Code Climate Build Status

注意:如果您使用Laravel 4,请检查Laravel 4分支

Eloquent OAuth是为Laravel 5设计的包,旨在使对各种OAuth提供者的认证变得非常简单。在配置文件中指定客户端ID和密钥,运行迁移后,只需两次方法调用,即可实现OAuth集成。

视频教程

Screenshot

基本示例

// 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();
});

支持的提供者

  • Facebook
  • GitHub
  • Google
  • LinkedIn
  • Instagram
  • SoundCloud

如果您想支持特定的提供者,请随时提出问题,或者更好的是,提交一个pull request。

安装

使用Composer添加此包

在项目目录内从命令行,只需输入

composer require adamwathan/eloquent-oauth

(或者您也可以手动编辑composer.json,在"require"部分添加以下行

"adamwathan/eloquent-oauth": "~5.0"

...然后运行composer update将包下载到您的vendor目录。)

更新您的配置

config/app.php中将服务提供者添加到providers数组中

'providers' => [
    // ...
    'AdamWathan\EloquentOAuth\EloquentOAuthServiceProvider',
    // ...
]

config/app.php中将外观添加到aliases数组中

'aliases' => [
    // ...
    'OAuth' => 'AdamWathan\EloquentOAuth\Facades\OAuth',
    // ...
]

发布包配置

通过运行提供的控制台命令发布配置文件和迁移

php artisan eloquent-oauth:install

接下来,重新迁移您的数据库

php artisan migrate

如果您需要更改存储OAuth标识所使用的表名,您可以在eloquent-oauth配置文件中这样做。

配置提供者

config/eloquent-oauth.php中更新您使用的提供者的应用程序信息

'providers' => [
    'facebook' => [
        'id' => '12345678',
        'secret' => 'y0ur53cr374ppk3y',
        'redirect' => 'https://example.com/facebook/login'),
        'scope' => [],
    ]
]

每个提供者都预先配置了必要的范围,以检索基本用户信息和用户的电子邮件地址,因此通常可以保留范围数组为空,除非您需要特定的附加权限。请咨询提供者的API文档,以了解各种服务提供的权限。

完成!

Eloquent OAuth旨在与Laravel的Eloquent认证驱动程序集成,因此请确保您在app/config/auth.php中使用eloquent驱动程序。您可以定义自己的User模型,添加您需要的任何行为,只需确保在app/config/auth.php中也指定您使用的模型及其完全限定名称空间。

用法

对OAuth提供者的认证是一个多步骤的过程,但我已经尽可能地简化了它。

通过提供者进行授权

首先,您需要定义授权路由。这是“登录”按钮指向的路由,该路由将用户重定向到提供者的域名以授权您的应用程序。授权后,提供者将用户重定向回您的第二个路由,该路由处理认证过程的其余部分。

要授权用户,只需直接从路由返回OAuth::authorize()方法。

Route::get('facebook/authorize', function() {
    return OAuth::authorize('facebook');
});

在您的应用程序中进行认证

接下来,您需要定义一个用于通过提供者返回的详细信息对您的应用程序进行认证的路由。

对于基本案例,您可以直接使用您正在认证的提供者名称调用 OAuth::login()。如果用户拒绝了您的应用程序,此方法将抛出 ApplicationRejectedException 异常,您可以捕获并按需处理。

login 方法在需要时将创建新用户,或者如果用户之前已使用过您的应用程序,则更新现有用户。

一旦 login 方法成功,用户将通过 Auth::user() 被认证并可用,就像他们通过您的应用程序正常登录一样。

use \AdamWathan\EloquentOAuth\Exceptions\ApplicationRejectedException;
use \AdamWathan\EloquentOAuth\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 提供者的基本信息的 ProviderUserDetails 对象,包括

  • 用户 ID
  • 昵称
  • 电子邮件
  • 图片 URL
  • 访问令牌
OAuth::login('facebook', function($user, $details) {
    $user->nickname = $details->nickname;
    $user->name = $details->firstName . ' ' . $details->lastName;
    $user->profile_image = $details->imageUrl;
    $user->save();
});

注意:Instagram API 不允许您检索用户的电子邮件地址,因此不幸的是,Instagram 提供者中的该字段始终为 null

高级:存储额外数据

记住:Eloquent OAuth 包的一个目标是对所有受支持提供者接收到的数据进行标准化,这样您就可以依赖上述特定数据项在 $details 对象中可用。

但是,每个提供者都提供自己的额外数据集。如果您需要访问或存储超出 Eloquent OAuth 的默认 ProviderUserDetails 对象提供的基础的额外数据,您需要做两件事

  1. 从提供者请求它,通过扩展其作用域

    例如,如果我们想收集用户在通过 Facebook 登录时的性别。

    config/eloquent-oauth.php 文件中,将 facebook 提供者部分的 [scope] 设置为包括 public_profile 作用域,如下所示

       'scope' => ['email', 'public_profile'],

有关每个提供者可用的作用域,请参阅该提供者的 API 文档。

注意:通过增加作用域,您将要求用户授予访问更多信息。他们将被告知您请求的作用域。如果您请求太多不必要的数据,他们可能会拒绝。因此,在请求额外作用域时要谨慎。

  1. 现在,在您执行 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()); 来查看可用的键。