yigitnerukuc/eloquent-oauth-l5

使用 Laravel 和 Eloquent 的简单 OAuth 认证

v0.3.1 2015-09-13 13:57 UTC

This package is not auto-updated.

Last update: 2024-09-18 18:47:55 UTC


README

注意:如果您正在使用 Laravel 4,请使用 Laravel 4 包

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

视频教程

Screenshot

基本示例

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

支持的提供商

  • Facebook
  • GitHub
  • Google
  • LinkedIn
  • Instagram
  • Soundcloud

如果您需要特定提供商的支持,请随时打开一个问题,或者更好的是,提交一个拉取请求。

安装

使用 Composer 添加此包

在您的项目目录中,只需在命令行中输入

composer require adamwathan/eloquent-oauth-l5

更新您的配置

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

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

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

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

发布包配置

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

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 中指定您使用的模型及其完全限定命名空间。

用法

对 OAuth 提供商进行认证是一个多步骤的过程,但我已尽力简化。

通过提供商进行授权

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

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

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

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

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

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

如果需要,此方法将创建新用户或更新现有用户。

一旦 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实例和一个包含来自OAuth提供者基本信息的ProviderUserDetails对象,包括

  • 用户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对象提供的超出基本数据之外的数据,您需要做两件事

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

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

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

       'scope' => ['public_profile'],

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

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

  1. 现在在您执行SocialAuth::login的地方,通过访问$details->raw()['KEY']数据将数据存储到您的$user对象中
       SocialAuth::login('facebook', function($user, $details) (
           $user->gender = $details->raw()['gender'];
           $user->save();
       });

提示:您可以通过在相同闭包中测试dd($details->raw());来查看可用的键。