我正在使用社交名媛进行Laravel身份验证登录。现在我可以从社交名流那里保存用户的数据了。但现在我面临的问题是如何从gmail、github认证用户。
经过一些研究,我明白了我需要创建自定义身份验证。我在谷歌上搜索过,但都是Laravel4.1的主题。如果有人对此进行了研究,请提供您的答案。
我已经阅读了以下主题,但我不知道如何做?
http://laravel.com/docs/5.1/authentication#social-认证
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。请注意,如果你是在其他版本。还要记住,恕我直言,这在Laravel中是一个相当高级的级别,因此如果你不完全理解你在做什么,你可能最终会崩溃你的应用程序。解决方案不是端到端正确的。这只是你需要做什么的一般指导方针,以便这一工作。
提示:此主题的Laravel文档在这里。
提示2:我认为你提到的最后一个链接非常有用。我是在读了那个链接后才知道这一切的。
http://laravel.io/forum/11-04-2014-laravel-5-how-do-i-create-a-custom-auth-in-laravel-5
在我们开始之前,我想首先描述一下登录流程,这将有助于您理解这个过程。Laravel使用驱动程序
连接到数据库以获取记录。两个驱动程序预先捆绑了laravel-雄辩的
在供应商文件夹中照亮\Auth\Guard
是主文件,其中包含用户登录和注销的代码。这个文件主要使用两个合同(或接口)
,我们需要覆盖它们,以便驱动程序工作。从Laravel自己的留档读到:
Lightlight\Contracts\Auth\UserProvider实现仅负责从持久性存储系统(如MySQL、Riak、,这两个接口允许Laravel身份验证机制继续运行,而不管用户数据是如何存储的,或者使用什么类型的类来表示它。
因此,我们的想法是,为了让驱动程序正常工作,我们需要实现illumb\Contracts\Auth\UserProvider
和illumb\Contracts\Auth\Authenticatable
,并告诉Laravel使用这些实现,而不是默认实现。
所以让我们开始吧。
步骤1:
为您的驱动程序选择一个名称。我命名我的社会名流
。然后在config/auth.php
中,将驱动程序
名称更改为社会名流
。通过这样做,我们只是告诉laravel使用这个驱动程序进行身份验证,而不是默认的eloquent
。
步骤2:
在你的应用程序/提供商/AuthService提供商
中的引导()
方法中添加以下行:
Auth::extend('socialite', function($app) {
$provider = new SocialiteUserProvider();
return new AuthService($provider, App::make('session.store'));
});
我们在这里所做的是:
Auth
facade来定义socialite
驱动程序李>步骤3:
创建SocialiteUserProvider
。如果您阅读了Laravel的文档,您将了解这些方法中的每一个应该返回什么。我创建了第一个方法作为示例。如您所见,我使用UserService
类获取结果。您可以获取自己的结果,无论您想要获取它们。然后我用它创建了一个User
对象。这个User
类实现illumb\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.
}
}
步骤4:
创建User
类,该类实现了可验证的
。这个类必须实现这个接口,因为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.
}
}
步骤5:
最后创建AuthService类,该类将调用Guard
方法。这是我自己的实现。你可以根据自己的需要写自己的。我们在这里所做的是扩展Guard
类来实现两个不言自明的新函数。
<?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;
}
}
步骤6:奖励步骤
为了完成我的回答,我还将解释UserService
类所期望的结构。首先让我们了解这个类做什么。在上述步骤中,我们创建了所有内容,让laravel知道如何使用我们的身份验证驱动程序,而不是他们的。但我们还没有告诉拉威尔它应该如何获得数据。我们告诉laravel如果你调用用户服务-
你正在使用Eloquent
。
public function getUserByEmail($email)
{
return UserModel::where('email', $email)->get();
}
例如,你正在使用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社会名流的好教程:https://mattstauffer.co/blog/using-github-authentication-for-login-with-laravel-socialite
Auth::login
不返回布尔值,您可以使用它尝试执行Auth::trunt
if(Auth::login($authUser, true)) {
return Redirect::to('user/UserDashboard');
}
按照教程进行操作,只需在主路径上配置中间件即可
$authUser = $this->findOrCreateUser($user);
Auth::login($authUser, true);
return Redirect::to('home');