Laravel 5 通过外部 API 对用户进行身份验证
Posted
技术标签:
【中文标题】Laravel 5 通过外部 API 对用户进行身份验证【英文标题】:Laravel 5 authenticate users through external API 【发布时间】:2016-04-15 21:37:17 【问题描述】:我想知道是否可以扩展内置身份验证以使用外部 API 对用户进行身份验证?我是 Laravel 新手,非常感谢您的帮助。 我正在为我的客户在 Laravel 5.2 中制作一个自定义应用程序,但我不能直接访问他们的数据库服务器,我只能调用他们的 API 来获取用户的详细信息。
谢谢。
【问题讨论】:
过去,我构建了一个自定义身份验证驱动程序和用户模型,将用户存储在会话中,而不是链接到数据库。这意味着用户无法相互交互,并且一旦会话终止,该用户“不存在”,但它在应用程序本身不需要存储任何有状态数据的情况下运行良好。 外部 API 本身是否有任何身份验证机制(a la OAuth)? 我仍然没有他们 API 的完整文档,但 OAuth 不能确定。我相信我需要通过 JSON 调用对用户进行身份验证。 @samlev 你有一些代码示例可以帮助找出解决方案吗? 这也是我想要实现的。登录表单发布到自定义的外部 Oauth2 服务器,然后当承载令牌返回时,我将它与内部控制器 http 请求一起使用... 【参考方案1】:如果我理解正确,您想从 facebook、twitter 或 github 等 API 记录用户吗?如果是这样,您需要使用名为 Socialite 的 laravel 包,这里是下载和使用它的链接: https://github.com/laravel/socialite
按照你的命令运行:
composer require laravel/socialite
接下来你需要告诉 laravel 你想使用这个包,所以你需要在 config/app.php 中添加这个:
'providers' => [
// Other service providers...
Laravel\Socialite\SocialiteServiceProvider::class,
],
这是别名:
'Socialite' => Laravel\Socialite\Facades\Socialite::class,
基本上,你需要在开发者网站上创建一个应用程序,我将以 facebook 为例。你需要去这个网站: https://developers.facebook.com/,创建一个帐户,您将获得您的应用程序 url 和密钥。您将在 .env 和 config/services 文件中使用它。
在您的 config/services 文件中,在条带后添加:
'facebook' => [
'client_id' => env('FACEBOOK_ID'),
'client_secret' => env('FACEBOOK_SECRET'),
'redirect' => env('FACEBOOK_URL'),
],
在你的 .env 文件中:
FACEBOOK_ID=*your facebook id*
FACEBOOK_SECRET=*your facebook secret*
FACEBOOK_URL=http://yourwebsite.com/callback
接下来,您需要一个控制器来处理身份验证过程,创建类似 SocialAuthController 的东西并将其放入:
public function redirect()
return Socialite::driver('facebook')->redirect();
public function callback()
$user = $this->findOrCreateFbUser(Socialite::driver('facebook')->user());
session([
'user' => $user
]);
return redirect()->route('/');
public function logout()
session()->forget('user');
return redirect()->route('home');
protected function findOrCreateFbUser($fbUser)
// the data you want to get from facebook
$fbData = [
'facebook_id' => $fbUser->id,
'avatar' => $fbUser->avatar,
'username' => $fbUser->name,
'email' => $fbUser->email,
];
$user = \App\User::where('facebook_id', $fbData['facebook_id'])->first();
if(!$user) $user = \App\User::create($fbData);
$user->update([
'avatar' => $fbUser->avatar,
'username' => $fbUser->name,
'email' => $fbUser->email
]);
return $user;
当然,您需要在您的用户数据库和模型中添加一个 facebook_id 字段。 在 User.php 中:
protected $fillable = [
'facebook_id',
'username',
'email',
'avatar'
];
我知道这个解决方案并不是真正动态的,因为它只适用于一个 api,我在 Laravel 还是很新的,这是我对 ***question 的第一个答案,但这对我有用 :) 如果我忘记了什么,请不要犹豫告诉我,以便我可以更新这个答案..
我还建议你在 Laracasts 网站上关注 Jeffrey Way 的社交认证教程,它非常有指导性和清晰性,感谢他,我可以做到!
【讨论】:
以上是关于Laravel 5 通过外部 API 对用户进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章
创建通过外部 API 进行身份验证的自定义身份验证提供程序?
减少对外部 API 的身份验证调用(Laravel 5.6)
Laravel Passport API:检索经过身份验证的令牌