adamwathan/eloquent-oauth

此包已被弃用且不再维护。没有推荐替代包。

使用Laravel和Eloquent实现的愚蠢简单的OAuth身份验证

v8.1.0 2015-10-26 14:05 UTC

README

重要:此包不再积极维护。 对于错误修复和新功能,请进行分支。

Eloquent OAuth

This Project Has Been Deprecated. Code Climate Scrutinizer Code Quality Build Status

Eloquent OAuth是为Laravel设计的包,旨在使对各种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

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

安装

请检查适用于您的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 对象基本功能的额外数据,您需要做两件事

  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()); 来测试可用的键。