簡體   English   中英

將 Laravel Socialite 與 API 一起使用?

[英]Using Laravel Socialite with an API?

我正在嘗試通過 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(在不同的域上)時,它崩潰了。 我認為代碼的生成方式存在一些問題。 有沒有什么辦法解決這一問題?

剛剛找到我的答案。 需要在兩個調用中使用stateless

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

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

希望這可以幫助某人。

我制作了SocialController.php和 url(POST 請求) /api/social-login ,它接受provideraccess_token

SocialAccount這里是一個laravel模型,在那里你會提供商和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創建了包

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM