李帅

社会化登录完成

......@@ -8,6 +8,7 @@ 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;
......@@ -24,125 +25,36 @@ class AuthController extends Controller
}
/**
* 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');
$validator = Validator::make(['code' => $request->code, 'provider' => $service], [
'code' => 'required',
'provider' => 'required|in:facebook,twitter,github,apple'
]);
if (!$code) return Response::fail('code miss');
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->name = $socialUser->getName();
// $newUser->email = $socialUser->getEmail() == '' ? '' : $socialUser->getEmail();
// $newUser->avatar = $socialUser->getAvatar();
// $newUser->password = '';
// $newUser->provider = $account;
// $newUser->provider_id = $socialUser->getId();
//
// $newUser->save();
// $user = $newUser;
// }
//
//
// Auth::login();
return Response::success($socialUser);
// //另一种写法
// $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->nickname = $socialUser->nickname ?? $socialUser->name;
$newUser->email = $socialUser->email ?? '';
$newUser->avatar = $socialUser->avatar ?? '';
$newUser->password = '';
$newUser->provider = $service;
$newUser->provider_id = $oauthUser->id;
$newUser->provider_id = $socialUser->id;
$newUser->save();
$user = $newUser;
......@@ -150,19 +62,14 @@ class AuthController extends Controller
// user_profile 保存
$userProfile = new UserProfile();
$userProfile->user_id = $user->id;
$userProfile->unionid = $oauthUser->unionid;
$userProfile->unionid = $socialUser->unionid ?? '';
$userProfile->save();
}
Auth::guard('api')->login($user);
$token = $user->createToken($user->id)->plainTextToken;
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
]);
$response = ['token' => $token];
return Response::success($response);
}
}
......
......@@ -12,7 +12,7 @@ class UserProfile extends Model
protected $table = 'user_profiles';
protected $fillable = ['user_id'];
protected $fillable = ['user_id','unionid'];
public function user()
{
......
......@@ -19,13 +19,12 @@ Route::prefix('v1')->namespace('App\Http\Controllers\V1')->group(function (Route
$api->post('/login', 'UserController@login');
$api->post('/register', 'UserController@register');
$api->get('/verify', 'UserController@verify');
});
Route::prefix('v1')->namespace('App\Http\Controllers\V1')->group(function (Router $api){
/** 移动端微信用户登录*/
/** 社会化用户登录*/
$api->get('auth/{service}/callback', 'AuthController@apiHandleProviderCallback');
});
//Route::prefix('v1')->namespace('App\Http\Controllers\V1')->middleware('auth:sanctum')->group(function ($api){
Route::prefix('v1')->namespace('App\Http\Controllers\V1')->group(function (Router $api) {
......