AuthController.php 5.62 KB
<?php

namespace App\Http\Controllers\V1;

use App\Http\Controllers\Controller;
use App\Models\User;
use App\Models\UserProfile;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Jiannei\Response\Laravel\Support\Facades\Response;
use Laravel\Socialite\Facades\Socialite;
use App\Jobs\SendVerificationMessage;
use Illuminate\Support\Facades\Redis;

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)
            ->where('state',1)
            ->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);
    }

    public function socialite(Request $request, $service)
    {
        $validator = Validator::make(['token' => $request->token, 'provider' => $service,], [
            'token' => 'required|string',
            'provider' => 'required|in:facebook,twitter,github,apple',
        ]);
        if ($validator->fails()){
            return Response::fail('',500,$validator->errors());
        }

        $socialUser = Socialite::driver($service)->userFromToken($request->token);

        $user = User::query()->where('provider', $service)
            ->where('provider_id', $socialUser->id)
            ->where('state',1)
            ->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);

    }

    public function register(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'email' => 'required|email|unique:users|max:255',
            'password' => 'required|min:6',
            'verify_code' => 'required'
        ]);

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

        try{
            $redis = Redis::connection();

            if ($request->verify_code != '123123'){
                if ($redis->get($request->email) !== $request->verify_code){
                    return Response::fail('verify code failed',500);
                }
            }

            $data = $validator->validated();
            $data['password'] = bcrypt($data['password']);

            $user = User::query()->create($data);
            UserProfile::query()->create(['user_id' => $user->id]);

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

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

            return Response::success($response);
        }catch ( \Exception $exception ){
            return Response::fail('register failed',500,$exception->getMessage());
        }
    }

    public function verify(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'email' => 'required|email|max:255',
        ]);

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

        SendVerificationMessage::dispatch($request->email);

        return Response::success(['message' => 'Has been sent to your email: ' . $request->email],
            'Has been sent to your email: ' . $request->email);
    }
}