李帅

社会化登录完成

...@@ -8,6 +8,7 @@ use App\Models\User; ...@@ -8,6 +8,7 @@ use App\Models\User;
8 use App\Models\UserProfile; 8 use App\Models\UserProfile;
9 use Illuminate\Http\Request; 9 use Illuminate\Http\Request;
10 use Illuminate\Support\Facades\Auth; 10 use Illuminate\Support\Facades\Auth;
11 +use Illuminate\Support\Facades\Validator;
11 use Jiannei\Response\Laravel\Support\Facades\Response; 12 use Jiannei\Response\Laravel\Support\Facades\Response;
12 use Laravel\Socialite\Facades\Socialite; 13 use Laravel\Socialite\Facades\Socialite;
13 14
...@@ -24,125 +25,36 @@ class AuthController extends Controller ...@@ -24,125 +25,36 @@ class AuthController extends Controller
24 } 25 }
25 26
26 /** 27 /**
27 - * web用户客户端授权后直接到这里 28 + * 社会化用户登录
28 - * @param Request $request
29 - * @param $service
30 - */
31 - public function handleProviderCallback(Request $request, $service)
32 - {
33 - $socialUser = Socialite::driver($service)->user();
34 - dd($socialUser);
35 -// //据说apple有问题需要用这种办法
36 -// if ($service === 'apple'){
37 -// // apple 登录
38 -// try {
39 -// if ($code = $request->code) {
40 -// $response = http('https://appleid.apple.com/auth/token', [
41 -// 'grant_type' => 'authorization_code',
42 -// 'code' => $code,
43 -// 'redirect_uri' => config('services.apple.redirect') ,
44 -// 'client_id' => config('services.apple.client_id') ,
45 -// 'client_secret' => config('services.apple.client_secret') ,
46 -// ]);
47 -// $id_token = $response->id_token;
48 -// } else {
49 -// $id_token = $request->access_token;
50 -// }
51 -// $oauthUser = json_decode(base64_decode(explode('.', $id_token) [1]));
52 -// }
53 -// catch(\Exception $e) {
54 -// return $this->failed('apple 参数错误');
55 -// }
56 -// }
57 -// function http($url, $params = false)
58 -// {
59 -// $ch = curl_init($url);
60 -// curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
61 -// if ($params) {
62 -// curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
63 -// } curl_setopt($ch, CURLOPT_HTTPHEADER, [
64 -// 'Accept: application/json',
65 -// 'User-Agent: curl', # Apple requires a user agent header at the token endpoint
66 -// ]);
67 -// $response = curl_exec($ch);
68 -// return json_decode($response);
69 -// }
70 - }
71 -
72 -
73 -
74 - /**
75 - * 移动端微信用户
76 * @param Request $request 29 * @param Request $request
77 * @param $service 30 * @param $service
78 * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\JsonResource 31 * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\JsonResource
79 */ 32 */
80 public function apiHandleProviderCallback(Request $request, $service) 33 public function apiHandleProviderCallback(Request $request, $service)
81 { 34 {
82 - $code = $request->get('code'); 35 + $validator = Validator::make(['code' => $request->code, 'provider' => $service], [
36 + 'code' => 'required',
37 + 'provider' => 'required|in:facebook,twitter,github,apple'
38 + ]);
83 39
84 - if (!$code) return Response::fail('code miss'); 40 + if ($validator->fails()){
41 + return Response::fail('',500,$validator->errors());
42 + }
85 43
86 $socialUser = Socialite::driver($service)->stateless()->user(); 44 $socialUser = Socialite::driver($service)->stateless()->user();
87 45
88 $user = User::query()->where('provider', $service)->where('provider_id', $socialUser->id)->first(); 46 $user = User::query()->where('provider', $service)->where('provider_id', $socialUser->id)->first();
89 47
90 -// if ($user == null){
91 -//
92 -// // 如果该用户不存在则将其保存到 users 表
93 -// $newUser = new User();
94 -//
95 -// $newUser->name = $socialUser->getName();
96 -// $newUser->email = $socialUser->getEmail() == '' ? '' : $socialUser->getEmail();
97 -// $newUser->avatar = $socialUser->getAvatar();
98 -// $newUser->password = '';
99 -// $newUser->provider = $account;
100 -// $newUser->provider_id = $socialUser->getId();
101 -//
102 -// $newUser->save();
103 -// $user = $newUser;
104 -// }
105 -//
106 -//
107 -// Auth::login();
108 -
109 -
110 -
111 -
112 -
113 -
114 -
115 - return Response::success($socialUser);
116 -
117 -
118 -// //另一种写法
119 -// $user = User::query()->firstOrCreate([
120 -// 'provider_id' => $oauthUser->id,
121 -// 'provider' => $service,
122 -// ],[
123 -// 'nickname' => $oauthUser->nickname,
124 -// 'avatar' => $oauthUser->avatar,
125 -// 'provider' => $service,
126 -// 'provider_id' => $oauthUser->id,
127 -// ]);
128 -//
129 -// UserProfile::query()->firstOrCreate([
130 -// 'user_id' => $user->id,
131 -// 'unionid' => $oauthUser->unionid,
132 -// ]);
133 -
134 - $user = User::query()->where( 'provider_id', '=', $oauthUser->id )
135 - ->where( 'provider', '=', $service )
136 - ->first();
137 -
138 if ($user == null){ 48 if ($user == null){
139 // 如果该用户不存在则将其保存到 users 表 49 // 如果该用户不存在则将其保存到 users 表
140 $newUser = new User(); 50 $newUser = new User();
141 51
142 - $newUser->nickname = $oauthUser->nickname; 52 + $newUser->nickname = $socialUser->nickname ?? $socialUser->name;
143 - $newUser->avatar = $oauthUser->avatar; 53 + $newUser->email = $socialUser->email ?? '';
54 + $newUser->avatar = $socialUser->avatar ?? '';
55 + $newUser->password = '';
144 $newUser->provider = $service; 56 $newUser->provider = $service;
145 - $newUser->provider_id = $oauthUser->id; 57 + $newUser->provider_id = $socialUser->id;
146 58
147 $newUser->save(); 59 $newUser->save();
148 $user = $newUser; 60 $user = $newUser;
...@@ -150,19 +62,14 @@ class AuthController extends Controller ...@@ -150,19 +62,14 @@ class AuthController extends Controller
150 // user_profile 保存 62 // user_profile 保存
151 $userProfile = new UserProfile(); 63 $userProfile = new UserProfile();
152 $userProfile->user_id = $user->id; 64 $userProfile->user_id = $user->id;
153 - $userProfile->unionid = $oauthUser->unionid; 65 + $userProfile->unionid = $socialUser->unionid ?? '';
154 $userProfile->save(); 66 $userProfile->save();
155 } 67 }
156 68
157 - Auth::guard('api')->login($user); 69 + $token = $user->createToken($user->id)->plainTextToken;
158 70
159 - return Response::success([ 71 + $response = ['token' => $token];
160 - 'user_id' => $user->id, 72 +
161 - 'nickname' => $user->nickname, 73 + return Response::success($response);
162 - 'mobile' => $user->mobile,
163 - 'gender' => $user->gender,
164 - 'avatar' => $user->avatar,
165 - 'token' => $user->createToken($user->id)->plainTextToken
166 - ]);
167 } 74 }
168 } 75 }
......
...@@ -12,7 +12,7 @@ class UserProfile extends Model ...@@ -12,7 +12,7 @@ class UserProfile extends Model
12 12
13 protected $table = 'user_profiles'; 13 protected $table = 'user_profiles';
14 14
15 - protected $fillable = ['user_id']; 15 + protected $fillable = ['user_id','unionid'];
16 16
17 public function user() 17 public function user()
18 { 18 {
......
...@@ -19,13 +19,12 @@ Route::prefix('v1')->namespace('App\Http\Controllers\V1')->group(function (Route ...@@ -19,13 +19,12 @@ Route::prefix('v1')->namespace('App\Http\Controllers\V1')->group(function (Route
19 $api->post('/login', 'UserController@login'); 19 $api->post('/login', 'UserController@login');
20 $api->post('/register', 'UserController@register'); 20 $api->post('/register', 'UserController@register');
21 $api->get('/verify', 'UserController@verify'); 21 $api->get('/verify', 'UserController@verify');
22 -});
23 22
24 -Route::prefix('v1')->namespace('App\Http\Controllers\V1')->group(function (Router $api){ 23 + /** 社会化用户登录*/
25 - /** 移动端微信用户登录*/
26 $api->get('auth/{service}/callback', 'AuthController@apiHandleProviderCallback'); 24 $api->get('auth/{service}/callback', 'AuthController@apiHandleProviderCallback');
27 }); 25 });
28 26
27 +
29 //Route::prefix('v1')->namespace('App\Http\Controllers\V1')->middleware('auth:sanctum')->group(function ($api){ 28 //Route::prefix('v1')->namespace('App\Http\Controllers\V1')->middleware('auth:sanctum')->group(function ($api){
30 Route::prefix('v1')->namespace('App\Http\Controllers\V1')->group(function (Router $api) { 29 Route::prefix('v1')->namespace('App\Http\Controllers\V1')->group(function (Router $api) {
31 30
......