AuthController.php 2.34 KB
<?php

namespace App\Http\Controllers\V1;

use App\Http\Controllers\Controller;
use App\Models\OneUser;
use App\Models\User;
use App\Models\UserProfile;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;
use Jiannei\Response\Laravel\Support\Facades\Response;
use Laravel\Socialite\Facades\Socialite;

class AuthController extends Controller
{
    /**
     * web用户先访问这里进行重定向
     * @param $service
     * @return \Illuminate\Http\RedirectResponse|\Symfony\Component\HttpFoundation\RedirectResponse
     */
    public function redirectToProvider($service)
    {
        return Socialite::driver($service)->redirect();
    }

    /**
     * 社会化用户登录
     * @param Request $request
     * @param $service
     * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\JsonResource
     */
    public function apiHandleProviderCallback(Request $request, $service)
    {
        $validator = Validator::make(['code' => $request->code, 'provider' => $service], [
            'code' => 'required',
            'provider' => 'required|in:facebook,twitter,github,apple'
        ]);

        if ($validator->fails()){
            return Response::fail('',500,$validator->errors());
        }

        $socialUser = Socialite::driver($service)->stateless()->user();

        $user = User::query()->where('provider', $service)->where('provider_id', $socialUser->id)->first();

        if ($user == null){
            // 如果该用户不存在则将其保存到 users 表
            $newUser = new User();

            $newUser->nickname  = $socialUser->nickname ?? $socialUser->name;
            $newUser->email     = $socialUser->email ?? '';
            $newUser->avatar    = $socialUser->avatar ?? '';
            $newUser->password    = '';
            $newUser->provider    = $service;
            $newUser->provider_id = $socialUser->id;

            $newUser->save();
            $user = $newUser;

            // user_profile 保存
            $userProfile = new UserProfile();
            $userProfile->user_id = $user->id;
            $userProfile->unionid = $socialUser->unionid ?? '';
            $userProfile->save();
        }

        $token = $user->createToken($user->id)->plainTextToken;

        $response = ['token' => $token];

        return Response::success($response);
    }
}