laravel是一种流行的php框架,用于开发web应用程序。其中一个最常见的功能是在应用程序中集成第三方登录。这样做可以为用户提供更好的用户体验,减少注册重复流程。
在本文中,我们将讨论如何使用Laravel Socialite库集成第三方登录。
什么是Laravel Socialite?
Laravel Socialite是Laravel框架的一个扩展包,它允许开发人员在应用程序中轻松实现第三方登录。它支持各种社交平台,如Facebook,Twitter,LinkedIn等。
Socialite如何工作?
Socialite授权工作原理如下:
用户单击“登录”按钮,该按钮将指向Socialite授权:
1
Route::get(auth/{provider}, AuthSocialController@redirectToProvider);
Socialite挑战用户以授权访问其社交媒体帐户; Socialite将重定向到社交媒体站点;
1
Route::get(auth/{provider}/callback, AuthSocialController@handleProviderCallback);
3.用户授权自己的帐户,社交媒体网站重定向到回调URL;
1
2
3
4
public function redirectToProvider($provider)
{
return Socialite::driver($provider)->redirect();
}
Socialite将带有授权代码的回调URL返回应用程序,应用程序将用授权代码请求OAuth访问令牌;
1
2
3
4
public function handleProviderCallback($provider)
{
$socialUser = Socialite::driver($provider)->user();
}
如何在Laravel中使用Socialite?
使用Socialite支持的任何社交媒体平台,您需要在以下两个地方设置应用程序凭据或密钥:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
facebook => [
client_id => env(FB_CLIENT_ID),
client_secret => env(FB_CLIENT_SECRET),
redirect => env(FB_CALLBACK_URL),
]
twitter => [
client_id => env(TW_CLIENT_ID),
client_secret => env(TW_CLIENT_SECRET),
redirect => env(TW_CALLBACK_URL),
],
google => [
client_id => env(GOOGLE_CLIENT_ID),
client_secret => env(GOOGLE_CLIENT_SECRET),
redirect => env(GOOGLE_CALLBACK_URL)
]
应用程序凭据或密钥旨在验证应用程序的身份。
我们将在config / services.php文件中进行此设置。
步骤1:创建授权路由
创建用于触发Socialite授权的路由:
1
2
Route::get(auth/{provider}, AuthSocialController@redirectToProvider);
Route::get(auth/{provider}/callback, AuthSocialController@handleProviderCallback);
通常将这些路由放置在一个名为SocialController的控制器中,该控制器用于处理Socialite授权和回调。
步骤2:创建SocialController
像所有控制器一样,我们需要创建使用良好的代码实践的SocialController。
使用以下命令来创建控制器:
1
php artisan make:controller AuthSocialController
最终,这将使我们可以使用授权提供程序进行授权并回调我们的路由。
在SocialController中,我们定义了两个方法,redirectToProvider和handleProviderCallback。 第一个是重定向至授权提供程序。 随后的回调函数则为具有授权代码的客户端检索信息并完成身份验证的客户端提供回调URL。
以下是SocialController的示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
namespace AppHttpControllersAuth;
use AppHttpControllersController;
use IlluminateSupportFacadesAuth;
use IlluminateHttpRequest;
use LaravelSocialiteFacadesSocialite;
class SocialController extends Controller
{
/**
* Redirect the user to the OAuth Provider.
*
* @return IlluminateHttpResponse
*/
public function redirectToProvider($provider)
{
return Socialite::driver($provider)->redirect();
}
/**
* Obtain the user information from OAuth Provider.
*
* @return IlluminateHttpResponse
*/
public function handleProviderCallback($provider)
{
$user = Socialite::driver($provider)->user();
// Do something with user data, for example:
// $user->token;
// $user->getId();
// $user->getEmail();
}
}
步骤3:使用视图控制器
通常,我们会使用视图控制器来管理渲染我们的所有视图。 这使我们的代码更易于阅读和管理。 让我们使用Laravel的视图控制器为我们的应用程序创建一个简单的视图。
使用以下命令来创建视图控制器:
1
php artisan make:controller SocialAuthController
以下是在该控制器中所做的更改。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
namespace AppHttpControllers;
use IlluminateHttpRequest;
class SocialAuthController extends Controller
{
/**
* Redirect the user to the OAuth Provider.
*
* @return IlluminateHttpResponse
*/
public function redirectToProvider($provider)
{
return Socialite::driver($provider)->redirect();
}
/**
* Obtain the user information from OAuth Provider.
*
* @return IlluminateHttpResponse
*/
public function handleProviderCallback($provider)
{
$user = Socialite::driver($provider)->user();
$existingUser = User::where(email, $user->getEmail())->first();
if ($existingUser) { // If user already exists, login the user
auth()->login($existingUser, true);
} else { // Register new user
$newUser = new User();
$newUser->name = $user->getName();
$newUser->email = $user->getEmail();
$newUser->google_id = $user->getId();
$newUser->password = encrypt(amitthakur);
$newUser->save();
auth()->login($newUser, true);
}
return redirect()->to(/home);
}
}
步骤4:创建登录视图
现在我们的控制器和路由都已准备就绪。 现在我们需要创建用于登录的视图。
创建一个视图文件并将其命名为social_login.blade.php。 我们需要显示可以触发第三方登录的按钮。 在这种情况下,我们将展示3个按钮,以支持Google,Facebook和Twitter的登录。
以下是视图文件的示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@extends(layouts.app)
@section(content)
<main class="py-4"><div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">{{ __(Login) }}</div>
<div class="card-body">
<a href="%7B%7B%20route(social.oauth,%20%5Bprovider%20=>%20google%5D)%20%7D%7D" class="btn btn-google">Sign in with google</a>
<a href="%7B%7B%20route(social.oauth,%20%5Bprovider%20=>%20facebook%5D)%20%7D%7D" class="btn btn-facebook">Sign in with Facebook</a>
<a href="%7B%7B%20route(social.oauth,%20%5Bprovider%20=>%20twitter%5D)%20%7D%7D" class="btn btn-twitter">Sign in with twitter</a>
</div>
</div>
</div>
</div>
</div>
</main>
@endsection
顶部使用布局文件。当用户单击任何按钮时,我们将它们重定向到授权提供程序。 在SocialController respond中,我们将获得用户数据并完成身份验证。
步骤5:创建新路由
现在我们需要创建新路由以处理上面的视图文件。
修改web.php文件,如下所示:
1
2
3
Route::get(social, SocialAuthController@index)->name(social.login);
Route::get(social/{provider}, SocialAuthController@redirectToProvider)->name(social.oauth);
Route::get(social/{provider}/callback, SocialAuthController@handleProviderCallback);
我们应该注意,上面的路由通过名称进行标识,以便可以在控制器代码中引用它们。
步骤6:测试
现在我们已经设置了我们的社交媒体标识,在测试应用程序之前,我们需要通过.env文件对我们的应用程序进行配置。
要配置.env文件,请添加以下代码:
1
2
3
4
5
6
7
8
9
10
11
FACEBOOK_CLIENT_ID=xxxxxxxxxxxxxxxxx
FACEBOOK_CLIENT_SECRET=xxxxxxxxxxxxxxxxxxxx
FACEBOOK_CALLBACK_URL=http://www.example.com/auth/facebook/callback
GOOGLE_CLIENT_ID=xxxxxxxxxxxxxxxxx
GOOGLE_CLIENT_SECRET=xxxxxxxxxxxxxxxxxxxx
GOOGLE_CALLBACK_URL=http://www.example.com/auth/google/callback
TWITTER_CLIENT_ID=xxxxxxxxxxxxxxxxx
TWITTER_CLIENT_SECRET=xxxxxxxxxxxxxxxxxxxx
TWITTER_CALLBACK_URL=http://www.example.com/auth/twitter/callback
该行中用“xxxxxxxxxxxxxxxxx”替换实际的应用程序标识。 之后,我们可以通过命令行启动我们的应用程序,并访问上面的视图文件。 一旦我们单击任何按钮并通过OAuth授权我们的帐户,我们将以已知的每个用户进行身份验证。
结论
在本文中,我们学习了如何使用Laravel Socialite库集成第三方登录。 Socialite的主要目的是简化社交媒体登录流程,以提高用户体验。 我们学习了如何设置Socialite以支持Google,Facebook和Twitter。 我们还在控制器中检索授权代码,并使用请求的数据完成OAuth身份验证。 该过程实际上将创建新帐户或更新现有帐户。
以上就是Laravel开发:如何使用Laravel Socialite快速集成第三方登录?的详细内容,更多请关注php中文网其它相关文章!