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
]);
}
この回答はLaravel 5.1に最適です。他のバージョンを使用している場合は注意してください。また、IMHOはLaravelのかなり高度なレベルであるため、そうでない場合は注意してください。何をしているのかを完全に理解すると、アプリケーションがクラッシュする可能性があります。解決策はエンドツーエンドで正しくありません。これは、これを機能させるために必要なことの一般的なガイドラインにすぎません。
ヒント: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 --eloquent
&database
。ニーズに合わせてカスタマイズできるように、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
ドライバーを定義しました。SocialiteUserProvider
はUserProvider
の実装です。AuthService
はGuard
クラスの拡張です。このクラスのコンストラクターが取る2番目のパラメーターは、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();
}
_
@skittlesに、ファイルを配置する場所を明確に示していないことを指摘していただきありがとうございます。すべてのファイルは指定された名前空間に従って配置されます。 。例えば。名前空間が_App\Extensions
_で、クラス名がSocialiteUserProvider
の場合、ファイルの場所は_App\Extensions\SocialiteUserProvider.php
_です。 laravelのApp
ディレクトリはapp
フォルダです。
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');