AuthController.php 9.15 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\Hash;
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 login(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'email' => 'required|email|max:255',
            'password' => 'required',
        ]);

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

        try{
            $user = User::query()->where('email', $request->email)->where('state', 1)->first();

            if (! $user || ! Hash::check($request->password, $user->password)) {
                throw new \Exception("账号或密码错误");
            }

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

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

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

    }

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

        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);
    }

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

        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();
            $user = User::query()->where("email", "=", $data["email"])->first();

            if (!$user) return Response::fail("查无此人");

            $user->password = bcrypt($data['password']);
            $user->save();
            return Response::success([],"The new password establishes the success. ");
        } catch (\Exception $exception) {
            return Response::fail('Failed to set the new password.', 500, $exception->getMessage());
        }
    }

    public function noPasswordLogin(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'account' => 'required|max:255',
            '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);
                }
            }

            $user = User::query()
                ->where(function ($query) use ($request){
                    $query->where("email",$request->account)->where("state",1);
                })
                ->orWhere(function ($query)use ($request){
                    $query->where("mobile",$request->account)->where("state",1);
                })
                ->first();

            if (!$user) Response::fail('The user does not exist');

            $token = $user->createToken($request->account)->plainTextToken;

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

            return Response::success($response);
        }catch ( \Exception $exception ){
            return Response::fail('账号或验证码错误',500,$exception->getMessage());
        }
    }
}