AuthController.php
4.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
<?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)->stateless()->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');
$driver = Socialite::driver($service);
$response = $driver->getAccessTokenResponse($code);
if (isset($response['errcode'])) return Response::fail($response['errmsg']);
$driver->setOpenId($response['openid']);
$oauthUser = $driver->getUserByToken($response['access_token']);
// //另一种写法
// $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
]);
}
}