andrewmclagan / laravel-passport-socialite
缺少的 Laravel Passport 社交认证功能
Requires
- php: ^7.1.3
- illuminate/support: ~5.7
- laravel/passport: ^5.0 || ^6.0 || ^7.0
- laravel/socialite: ^4.0
- schedula/league-oauth2-social: ^1.0
README
Laravel Passport 缺失的社交认证插件(即 SocialGrant)。
描述
此包帮助使用 Laravel 的原生包(即 passport 和 socialite)集成社交登录。此包允许从 Laravel/socialite 包支持的提供者进行社交登录。
入门指南
要开始,请使用以下命令将以下包添加到您的 composer.json 文件中。
composer require schedula/laravel-passport-socialite
配置
当 composer 成功安装此包后,请将 Schedula\Laravel\PassportSocialite\PassportSocialiteServiceProvider::class
注册到您的 config/app.php
配置文件中。
'providers' => [ // Other service providers... Schedula\Laravel\PassportSocialite\PassportSocialiteServiceProvider::class, ],
注意:您需要配置第三方社交提供者的密钥和密钥字符串,如 Laravel socialite 文档中所述 https://laravel.net.cn/docs/5.6/socialite#configuration
使用方法
步骤 1 - 设置用户模型
在您的 User
模型上实现 UserSocialAccount
,然后添加方法 findForPassportSocialite
。 findForPassportSocialite
应接受两个参数,即 $provider
和 $id
$provider - 字符串 - 将是社交提供者,例如 facebook、google、github 等。
$id - 字符串 - 是社交提供者的用户 ID,例如 facebook 的用户 ID 1234567890
函数应该找到与该信息相关联的用户并返回用户对象,如果未找到则返回 null
以下是上述实现后您的 User
模型应该看起来像什么。
namespace App; use Schedula\Laravel\PassportSocialite\User\UserSocialAccount; class User extends Authenticatable implements UserSocialAccount { use HasApiTokens, Notifiable; /** * Find user using social provider's id * * @param string $provider Provider name as requested from oauth e.g. facebook * @param string $id User id of social provider * * @return User */ public static function findForPassportSocialite($provider,$id) { $account = SocialAccount::where('provider', $provider)->where('provider_user_id', $id)->first(); if($account) { if($account->user){ return $account->user; } } return; } }
注意:这里的 SocialAccount
是一个 Laravel 模型,其中我保存了提供者和提供者用户 ID 以及本地数据库用户 ID。以下是 social_accounts
表的示例
步骤 2 - 使用社交提供者获取访问令牌
我建议您不要直接从您的应用程序中请求社交授权的访问令牌,因为社交登录的逻辑/概念是如果不存在,则需要创建账户,如果已存在,则登录。
所以在这里,我们将创建一个自定义路由和一个控制器,该控制器将接收来自您的客户端(即 Android、iOS 等应用程序)的访问令牌或授权令牌。 这里客户端从提供者获取访问令牌/授权令牌
我们的路由可以是这样的
Route::post('/auth/social/facebook', 'SocialLogin@loginFacebook');
以下是我们可以如何编写我们的控制器及其方法
use Illuminate\Http\Request; use App\Http\Controllers\Controller; use Route; class SocialLogin extends Controller { public function loginFacebook(Request $request) { try { $facebook = Socialite::driver('facebook')->userFromToken($request->accessToken); if(!$exist = SocialAccount::where('provider', SocialAccount::SERVICE_FACEBOOK)->where('provider_user_id', $facebook->getId())->first()){ // create user account } return response()->json($this->issueToken($request, 'facebook', $request->accessToken)); } catch(\Exception $e) { return response()->json([ "error" => $e->getMessage() ]); } } public function issueToken($request, $provider, $accessToken) { /** * Here we will request our app to generate access token * and refresh token for the user using its social identity by providing access token * and provider name of the provider. (I hope its not confusing) * and then it goes through social grant and which fetches providers user id then calls * findForPassportSocialite from your user model if it returns User object then it generates * oauth tokens or else will throw error message normally like other oauth requests. */ $params = [ 'grant_type' => 'social', 'client_id' => 'your-client-id', // it should be password grant client 'client_secret' => 'client-secret', 'accessToken' => $accessToken, // access token from provider 'provider' => $provider, // i.e. facebook ]; $request->request->add($params); $requestToken = Request::create("oauth/token", "POST"); $response = Route::dispatch($requestToken); return json_decode((string) $response->content(), true); } }
注意:SocialGrant 只接受访问令牌,不接受授权令牌,例如,当请求服务器授权代码时,google 提供授权令牌,因此您需要将授权代码交换为访问令牌。请参阅此处: https://github.com/google/google-api-php-client
注意:SocialGrant 与 PasswordGrant 类似,因此在制作 oauth 请求时请确保使用密码授权的客户端 ID 和密钥
以上就是所有内容了