将 Laravel Socialite 与 API 一起使用?

Posted

技术标签:

【中文标题】将 Laravel Socialite 与 API 一起使用?【英文标题】:Using Laravel Socialite with an API? 【发布时间】:2016-06-28 06:08:13 【问题描述】:

我正在尝试通过 api 使用 Laravel Socialite 包。我尝试将代码传递到我的 api 以获取用户,但它一直给我一个错误:

Fatal error: Call to a member function pull() on null

由于我是通过 API 发出请求,因此我采取以下步骤。

向 api 发送请求以获取 url 以获取代码:

Socialite::with('facebook')->stateless()->redirect()->getTargetUrl()

然后使用上面获取的 url 发出请求,该请求使用 code 参数进行重定向。

将代码发送到 api 并获取用户:

$fb_user = Socialite::with('facebook')->user();

这是崩溃的地方。我不确定为什么。

我以前使用过这个包,当我只有一个重新加载页面的应用程序时它工作正常。但是当我将它发送到一个 api(在不同的域上)时,它会崩溃。我认为代码的生成方式存在一些问题。有没有办法解决这个问题?

【问题讨论】:

看看这个,它可能会有所帮助laravel socialite 【参考方案1】:

刚刚找到我的答案。需要在两个调用中使用stateless

Socialite::with('facebook')->stateless()->redirect()->getTargetUrl()

$fb_user = Socialite::with('facebook')->stateless()->user();

希望这对某人有所帮助。

【讨论】:

嗨!您如何在前端使用 targetUrl?谢谢! @MiguelStevens laravel.com/docs/8.x/socialite#stateless-authentication【参考方案2】:

我创建了SocialController.php 和url(POST 请求)/api/social-login,它接受provideraccess_token

SocialAccount 这是一个 laravel 模型,您将在其中提供 provider 和 provider_user_id 以及本地数据库用户 ID。下面是social_accounts表的例子

SocialController

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use Illuminate\Http\Request;
use App\User;
use App\SocialAccount;
use Socialite;

class SocialController extends Controller

public function social(Request $request) 

    $provider = $request->input('provider');
    switch($provider)
        case SocialAccount::SERVICE_FACEBOOK:
            $social_user = Socialite::driver(SocialAccount::SERVICE_FACEBOOK)->fields([
                'name', 
                'first_name', 
                'last_name', 
                'email'
            ]);
            break;
        case SocialAccount::SERVICE_GOOGLE:
            $social_user = Socialite::driver(SocialAccount::SERVICE_GOOGLE)
            ->scopes(['profile','email']);
            break;
        default :
            $social_user = null;
    

    abort_if($social_user == null , 422,'Provider missing');

    $social_user_details = $social_user->userFromToken($request->input('access_token'));

    abort_if($social_user_details == null , 400,'Invalid credentials'); //|| $fb_user->id != $request->input('userID')

    $account = SocialAccount::where("provider_user_id",$social_user_details->id)
            ->where("provider",$provider)
            ->with('user')->first();

    if($account)
        return $this->issueToken($account->user);
    
    else  
        // create new user and social login if user with social id not found.
        $user = User::where("email",$social_user_details->getEmail())->first();
        if(!$user)  
            // create new social login if user already exist.
            $user = new User;
            switch($provider)
                case SocialAccount::SERVICE_FACEBOOK:
                    $user->first_name = $social_user_details->user['first_name'];
                    $user->last_name = $social_user_details->user['last_name'];
                    break;
                case SocialAccount::SERVICE_GOOGLE:
                    $user->first_name = $social_user_details->user['name']['givenName'];
                    $user->last_name = $social_user_details->user['name']['familyName'];
                    break;
                default :
                        
            $user->email = $social_user_details->getEmail();
            $user->username = $social_user_details->getEmail();
            $user->password = Hash::make('social');
            $user->save();
        
        $social_account = new SocialAccount;
        $social_account->provider = $provider;
        $social_account->provider_user_id = $social_user_details->id;
        $user->social_accounts()->save($social_account);
        return $this->issueToken($user);
    
 

private function issueToken(User $user) 

    $userToken = $user->token() ?? $user->createToken('socialLogin');

    return [
        "token_type" => "Bearer",
        "access_token" => $userToken->accessToken
    ];


编辑:

我已经为同一个https://packagist.org/packages/pimplesushant/laravelsocialiteapi创建了包

【讨论】:

我正在寻找 userFromToken 方法 :-) 谢谢! 爱它..谢谢。我们一有机会见面就会给你买啤酒。 @MDAlauddinAl-Amin :-D 哈哈。如果您有机会访问印度,请告诉我 ;-) 很好的解决方案。它帮助到我。谢谢!

以上是关于将 Laravel Socialite 与 API 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

JWT + Laravel Socialite 与 OAuth 参数

Laravel Socialite 与 Facebook 未登录

使用 Laravel Socialite 登录 Facebook

找不到类“Laravel\Socialite\SocialiteServiceProvider”

在没有会话的情况下使用 laravel socialite 和 jwt-auth

Laravel 7 Socialite Google 登录显示无效的授权错误