AuthController.php 4.63 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 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();
    }

    /**
     * web用户客户端授权后直接到这里
     * @param Request $request
     * @param $service
     */
    public function handleProviderCallback(Request $request, $service)
    {
        $socialUser = Socialite::driver($service)->user();
        dd($socialUser);
//        //据说apple有问题需要用这种办法
//        if ($service === 'apple'){
//            // apple 登录
//            try {
//                if ($code = $request->code) {
//                    $response = http('https://appleid.apple.com/auth/token', [
//                        'grant_type' => 'authorization_code',
//                        'code' => $code,
//                        'redirect_uri' => config('services.apple.redirect') ,
//                        'client_id' => config('services.apple.client_id') ,
//                        'client_secret' => config('services.apple.client_secret') ,
//                    ]);
//                    $id_token = $response->id_token;
//                } else {
//                    $id_token = $request->access_token;
//                }
//                $oauthUser = json_decode(base64_decode(explode('.', $id_token) [1]));
//            }
//            catch(\Exception $e) {
//                return $this->failed('apple 参数错误');
//            }
//        }
//        function http($url, $params = false)
//        {
//            $ch = curl_init($url);
//            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//            if ($params) {
//                curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
//            }  curl_setopt($ch, CURLOPT_HTTPHEADER, [
//            'Accept: application/json',
//            'User-Agent: curl', # Apple requires a user agent header at the token endpoint
//        ]);
//            $response = curl_exec($ch);
//            return json_decode($response);
//        }
    }



    /**
     * 移动端微信用户
     * @param Request $request
     * @param $service
     * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\JsonResource
     */
    public function apiHandleProviderCallback(Request $request, $service)
    {
        $code = $request->get('code');

        if (!$code) return Response::fail('code miss');

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

        return Response::success($user);

//        //另一种写法
//        $user = User::query()->firstOrCreate([
//            'provider_id' => $oauthUser->id,
//            'provider' => $service,
//        ],[
//            'nickname'    => $oauthUser->nickname,
//            'avatar'      => $oauthUser->avatar,
//            'provider'    => $service,
//            'provider_id' => $oauthUser->id,
//        ]);
//
//        UserProfile::query()->firstOrCreate([
//            'user_id' => $user->id,
//            'unionid' => $oauthUser->unionid,
//        ]);

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

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

            $newUser->nickname    = $oauthUser->nickname;
            $newUser->avatar      = $oauthUser->avatar;
            $newUser->provider    = $service;
            $newUser->provider_id = $oauthUser->id;

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

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

        Auth::guard('api')->login($user);

        return Response::success([
            'user_id'    => $user->id,
            'nickname'   => $user->nickname,
            'mobile'      => $user->mobile,
            'gender'     => $user->gender,
            'avatar'     => $user->avatar,
            'token'      => $user->createToken($user->id)->plainTextToken
        ]);
    }
}