Используете Laravel Socialite с API?

Я пытаюсь использовать пакет Laravel Socialite через api. Я пытаюсь передать код в свой 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 (в другом домене), он вылетает. Я думаю, что есть некоторая проблема с тем, как генерируется код. Есть ли способ исправить это?


person Rob    schedule 13.03.2016    source источник
comment
проверьте это, это может помочь laravel socialite   -  person nooby    schedule 13.03.2016


Ответы (2)


Только что нашел свой ответ. Необходимо использовать stateless в обоих вызовах:

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

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

Надеюсь, это кому-то поможет.

person Rob    schedule 13.03.2016
comment
Привет! Как вы используете targetUrl в своем интерфейсе? Спасибо! - person Miguel Stevens; 29.06.2018

Я сделал SocialController.php и URL (запрос POST) /api/social-login, который принимает provider и access_token.

SocialAccount вот модель laravel, в которой вы увидите provider, provider_user_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

person Sushant Pimple    schedule 20.06.2018
comment
Искал userFromToken метод :-) спасибо! - person Robin C Samuel; 16.02.2019
comment
Просто люблю это .. спасибо. куплю тебе пива, когда мы случайно встретимся. ‹3 - person MD Alauddin Al-Amin; 20.01.2020
comment
@ MDAlauddinAl-Amin :-D Ха-ха. Дайте мне знать, если вы случайно приедете в Индию ;-) - person Sushant Pimple; 22.01.2020
comment
Хорошее решение. Это помогает мне. Спасибо! - person Leap Bun; 29.12.2020