web-dev-qa-db-ja.com

Laravel 5.1カスタム認証ドライバーを作成する方法は?

Laravel socialiteを使用した認証ログインで作業しています。socialiteからユーザーのデータを保存できるようになりました。しかし、gmail、githubからユーザーを認証する方法に問題があります。

調査の結果、カスタム認証を作成する必要があることがわかりました。私はグーグルで検索しましたが、すべてLaravel 4.1トピックです。誰かがこれに取り組んでいる場合は、あなたの答えを提供してください。

私はすでに次のトピックを読みましたが、それを行う方法がわかりませんでしたか?

http://laravel.com/docs/5.1/authentication#social-authentication

http://laravel.com/docs/5.1/providers

http://laravel-recipes.com/recipes/115/using-your-own-authentication-driver

http://laravel.io/forum/11-04-2014-laravel-5-how-do-i-create-a-custom-auth-in-laravel-5

更新

public function handleProviderCallback() {
    $user = Socialite::with('github')->user();
    $email=$user->email;
    $user_id=$user->id;

    //$authUser = User::where('user_id',$user_id)->where('email', $email)->first();
    $authUser = $this->findOrCreateUser($user);

    if(Auth::login($authUser, true)) {
        return Redirect::to('user/UserDashboard');
    }   
}

private function findOrCreateUser($user) {
    if ($authUser = User::where('user_id',$user->id)->first()) {
        return $authUser;
    }

    return User::create([
        'user_id' => $user->id,
        'name' => $user->nickname,
        'email' => $user->email,
        'avatar' => $user->avatar
    ]);
}
10
scott

この回答はLaravel 5.1に最適です。他のバージョンを使用している場合は注意してください。また、IMHOはLaravelのかなり高度なレベルであるため、そうでない場合は注意してください。何をしているのかを完全に理解すると、アプリケーションがクラッシュする可能性があります。解決策はエンドツーエンドで正しくありません。これは、これを機能させるために必要なことの一般的なガイドラインにすぎません。

カスタム認証ドライバーの追加Laravel 5.1

ヒント:Laravelこのトピックのドキュメントは ここ です。

ヒント2:あなたが言及した最後のリンクは私の意見では非常に役に立ちます。そのリンクを読んだ後、私はこれらすべてを学びました。

http://laravel.io/forum/11-04-2014-laravel-5-how-do-i-create-a-custom-auth-in-laravel-5


始める前に、プロセスを理解するのに役立つログインフローについて説明したいと思います。 Laravelはdriverを使用してデータベースに接続し、レコードをフェッチします。2つのドライバーはlaravel --eloquentdatabase。ニーズに合わせてカスタマイズできるように、3番目を作成します。

ベンダーフォルダ内の_Illuminate\Auth\Guard_は、ユーザーがログインおよびログアウトするためのコードを含むメインファイルです。そして、このファイルは主に2つのContracts (or interfaces)を使用します。これらは、ドライバーが機能するためにオーバーライドする必要があります。 Laravel自身のドキュメントからこれを読んでください:

Illuminate\Contracts\Auth\UserProvider実装は、MySQL、Riakなどの永続ストレージシステムからIlluminate\Contracts\Auth\Authenticatable実装をフェッチすることのみを担当します。これらの2つのインターフェイスはLaravelユーザーデータの保存方法や、それを表すために使用されるクラスのタイプに関係なく、機能し続けるための認証メカニズム。

つまり、ドライバーが機能するには、_Illuminate\Contracts\Auth\UserProvider_と_Illuminate\Contracts\Auth\Authenticatable_を実装し、デフォルトの代わりにこれらの実装を使用するようにLaravelに指示する必要があります。


それでは始めましょう。

_Step 1:_ドライバーの名前を選択してください。私の名前はsocialiteです。次に、_config/auth.php_で、driver名をsocialiteに変更します。これを行うことで、デフォルトのeloquentの代わりにこのドライバーを認証に使用するようにlaravelに指示しました。

_Step 2:_boot()メソッドの_app/Provider/AuthServiceProvider_に次の行を追加します。

_Auth::extend('socialite', function($app) {
    $provider = new SocialiteUserProvider();
    return new AuthService($provider, App::make('session.store'));
});
_

ここで行ったことは次のとおりです。

  • 最初にAuthファサードを使用して、socialiteドライバーを定義しました。
  • SocialiteUserProviderUserProviderの実装です。
  • AuthServiceGuardクラスの拡張です。このクラスのコンストラクターが取る2番目のパラメーターは、laravelがセッションの取得と設定に使用するセッションです。
  • したがって、基本的にLaravelは、デフォルトの実装ではなく、独自のGuardクラスの実装を使用するように指示しました。

_Step 3:_SocialiteUserProviderを作成します。 Laravelのドキュメントを読むと、これらの各メソッドが何を返すかを理解できます。最初のメソッドをサンプルとして作成しました。ご覧のとおり、私はUserServiceクラスを使用して結果をフェッチしています。独自の結果を取得できますが、取得したい結果は取得できます。次に、それからUserオブジェクトを作成しました。このUserクラスは、_Illuminate\Contracts\Auth\Authenticatable_コントラクトを実装します。

_<?php
namespace App\Extensions;

use App\User;
use App\Services\UserService;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Contracts\Auth\UserProvider;

class SocialiteUserProvider implements UserProvider
{
    private $userService;

    public function __construct(UserService $userService)
    {
        $this->userService = $userService;
    }

    public function retrieveById($identifier)
    {
        $result = $this->userService->getUserByEmail($identifier);
        if(count($result) === 0)
        {
            $user = null;
        }
        else
        {
            $user = new User($result[0]);
        }

        return $user;
    }

    public function retrieveByToken($identifier, $token)
    {
        // Implement your own.
    }

    public function updateRememberToken(Authenticatable $user, $token)
    {
        // Implement your own.
    }

    public function retrieveByCredentials(array $credentials)
    {
        // Implement your own.
    }

    public function validateCredentials(Authenticatable $user, array $credentials)
    {
        // Implement your own.
    }
}
_

_Step 4:_Userを実装するAuthenticatableクラスを作成します。 Guardクラスはこのクラスを使用して値を取得するため、このクラスはこのインターフェイスを実装する必要があります。

_<?php
namespace App;

use Illuminate\Contracts\Auth\Authenticatable;

class User implements Authenticatable
{
    protected $primaryKey = 'userEmail';
    protected $attributes = [];

    public function __construct(array $attributes)
    {
        $this->attributes = $attributes;
    }

    public function getUserAttributes()
    {
        return $this->attributes;
    }

    public function getAuthIdentifier()
    {
        return $this->attributes[$this->primaryKey];
    }

    public function getAuthPassword()
    {
        // Implement your own.
    }

    public function getRememberToken()
    {
        // Implement your own.
    }

    public function setRememberToken($value)
    {
        // Implement your own.
    }

    public function getRememberTokenName()
    {
        // Implement your own.
    }
}
_

_Step 5:_最後に、Guardメソッドを呼び出すAuthServiceクラスを作成します。これは私自身の実装です。あなたはあなたの必要に応じてあなた自身を書くことができます。ここで行ったことは、Guardクラスを拡張して、自明の2つの新しい関数を実装することです。

_<?php
namespace App\Services;

use Illuminate\Auth\Guard;

class AuthService extends Guard
{
    public function signin($email)
    {
        $credentials = array('email' => $email);
        $this->fireAttemptEvent($credentials, false, true);
        $this->lastAttempted = $user = $this->provider->retrieveById($email);

        if($user !== null)
        {
            $this->login($user, false);
            return true;
        }
        else
        {
            return false;
        }
    }

    public function signout()
    {
        $this->clearUserDataFromStorage();

        if(isset($this->events))
        {
            $this->events->fire('auth.logout', [$this->user()]);
        }

        $this->user = null;
        $this->loggedOut = true;
    }
}
_

_Step 6: Bonus Step_答えを完成させるために、UserServiceクラスが期待する構造についても説明します。まず、このクラスの機能を理解しましょう。上記の手順では、認証ドライバーの代わりに認証ドライバーの使用方法をlaravelに知らせるためにすべてを作成しましたが、laravel laravel userService->getUserByEmail($email)メソッドを呼び出すと、データを取得できると言ったので、この関数を実装するだけで済みます。

例1 Eloquentを使用しています。

_public function getUserByEmail($email)
{
    return UserModel::where('email', $email)->get();
}
_

例2 Fluentを使用しています。

_public function getUserByEmail($email)
{
    return DB::table('myusertable')->where('email', '=', $email)->get();
}
_

更新:2016年6月19日

@skittlesに、ファイルを配置する場所を明確に示していないことを指摘していただきありがとうございます。すべてのファイルは指定された名前空間に従って配置されます。 。例えば。名前空間が_App\Extensions_で、クラス名がSocialiteUserProviderの場合、ファイルの場所は_App\Extensions\SocialiteUserProvider.php_です。 laravelのAppディレクトリはappフォルダです。

16
Rash

laravel socialite here: https://mattstauffer.co/blog/using-github-authentication-for-login-with-laravel-socialite を設定するための優れたチュートリアル

Auth::login は、Auth::attemptを実行するために使用できるブール値を返しません。

if(Auth::login($authUser, true)) {
    return Redirect::to('user/UserDashboard');
}

チュートリアルに従ってこれを実行し、ホームルートにミドルウェアを構成するだけです

$authUser = $this->findOrCreateUser($user);

Auth::login($authUser, true);

return Redirect::to('home');
0
nathanmac