xutl/laravel-passport-socialite

这是 Laravel Passport 的社交授权。

1.0.1 2018-12-29 09:34 UTC

This package is auto-updated.

Last update: 2024-08-29 04:20:15 UTC


README

缺失的 Laravel Passport 社交认证插件(即 SocialGrant)。

修改自 https://github.com/schedula/laravel-passport-socialite

Laravel Passport Socialite

缺失的 Laravel Passport 社交认证插件(即 SocialGrant)。

描述

此包帮助使用 Laravel 的本地包(即 passport 和 socialite)集成社交登录。此包允许从 Laravel/socialite 包支持的提供者进行社交登录。

入门指南

要开始使用,请使用以下命令将以下包添加到您的 composer.json 文件中。

composer require xutl/laravel-passport-socialite

配置

当 composer 成功安装此包后,请在您的 config/app.php 配置文件中注册 XuTL\Passport\Socialite\PassportSocialiteServiceProvider::class

'providers' => [
    // Other service providers...
    XuTL\Passport\Socialite\PassportSocialiteServiceProvider::class,
],

注意:您需要配置第三方社交提供者的密钥和密钥字符串,如 Laravel Socialite 文档中所述 https://laravel.net.cn/docs/5.6/socialite#configuration

使用方法

步骤 1 - 设置用户模型

在您的 User 模型上实现 UserSocialAccount,然后添加方法 findForPassportSocialitefindForPassportSocialite 应接受两个参数,即 $provider$socialUser

$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 user
    * 
    * @param string $provider Provider name as requested from oauth e.g. facebook
    * @param string $socialUser User of social provider
    *
    * @return User
    */
    public static function findForPassportSocialite($provider,$socialUser) {
        $account = SocialAccount::where('provider', $provider)->where('social_id', $socialUser->getId())->first();
        if($account && $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->getBody(), true);
	}
}

注意:SocialGrant 仅接受访问令牌,不接受授权令牌。例如,Google 在请求服务器 auth code(即离线访问)时提供授权令牌,因此您需要将 auth code 交换为访问令牌。请参阅此处:https://github.com/google/google-api-php-client

注意:SocialGrant 的行为类似于 PasswordGrant,因此请确保在发起 oauth 请求时使用密码授权的客户端 ID 和密钥

这就是全部内容