From 1f1d7b9bd1afb7bcabfea0c9e8463fe64e3a919e Mon Sep 17 00:00:00 2001 From: hgc Date: Tue, 24 Dec 2024 17:31:48 +0800 Subject: [PATCH] =?UTF-8?q?=E9=AA=8C=E8=AF=81=E6=8E=88=E6=9D=83=E5=92=8C?= =?UTF-8?q?=E8=A7=A3=E7=BB=91=E7=9A=84refreshtoken=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controller/OAuthController.php | 25 ++++++++++-- app/event/GoogleAdsAds.php | 10 +---- app/event/GoogleAdsCampaigns.php | 6 --- app/event/GoogleAdsDateDatas.php | 9 +---- app/event/GoogleAdsGroups.php | 7 ---- app/middleware/Cros.php | 2 +- app/middleware/OauthCheck.php | 62 ++++++++++++++++++++++++++++++ app/service/GoogleOAuthService.php | 28 +++++++++++++- config/route.php | 17 +++++--- config/thinkorm.php | 1 + 10 files changed, 127 insertions(+), 40 deletions(-) create mode 100644 app/middleware/OauthCheck.php diff --git a/app/controller/OAuthController.php b/app/controller/OAuthController.php index 6a8c276..0dc1ae6 100644 --- a/app/controller/OAuthController.php +++ b/app/controller/OAuthController.php @@ -7,8 +7,6 @@ use support\Request; use support\Response; use DI\Annotation\Inject; use app\model\ThirdUserAdvertiser; -use app\model\ThirdUser as ThirdUserModel; -use think\facade\Db as ThinkDb; class OAuthController { @@ -42,6 +40,17 @@ class OAuthController // state值验证通过,继续处理授权码 $googleOAuthService = new GoogleOAuthService(); $tokens = $googleOAuthService->getRefreshToken($code); + if (!isset($tokens['refresh_token'])) { + return $this->errorResponse(300, 'Invalid state parameter'); + }else{ + // 保存refresh token到数据库 + $googleOAuthService->updateRefreshToken($tokens['refresh_token'], $tokens['access_token']); + // 根据新用户绑定插入新数据todo +// if(!$result) { +// $googleOAuthService->saveRefreshToken($tokens['refresh_token'], $tokens['access_token']); +// } + + } return $this->successResponse($tokens); } @@ -77,9 +86,17 @@ class OAuthController public function revokeRefreshToken(Request $request) { - $accessToken = $request->input('token'); //access token - $googleOAuthService = new GoogleOAuthService(); +// $accessToken = $request->input('token'); //access token +// $customerId = isset($requestData['ad_customer_id']) ? $requestData['ad_customer_id'] : getenv('GOOGLE_ADS_CUSTOMER_ID'); + $customerId = getenv('GOOGLE_ADS_CUSTOMER_ID'); //临时指定 + // 通过 advertiser_id 查询 ThirdUserAdvertiser,联表查询 ThirdUser 数据 + $userAdvertiser = ThirdUserAdvertiser::with('googleUser') // 联表查询 user 关联 + ->where('advertiser_id', $customerId) // 根据 advertiser_id 查询 + ->find(); // 获取第一个结果 +// dump($userAdvertiser->googleUser->access_token); + $accessToken = $userAdvertiser->googleUser->access_token; + $googleOAuthService = new GoogleOAuthService(); $googleOAuthService->revokeToken($accessToken); return $this->successResponse(['deleted' => 'success']); diff --git a/app/event/GoogleAdsAds.php b/app/event/GoogleAdsAds.php index 1b98f6c..5b18df7 100644 --- a/app/event/GoogleAdsAds.php +++ b/app/event/GoogleAdsAds.php @@ -18,13 +18,6 @@ use support\Redis; class GoogleAdsAds { - /** - * @Inject - * @var GoogleAdsAdService - */ - - private $googleAdsAdService; - /** * @Inject * @var GoogleOAuthService @@ -63,7 +56,8 @@ class GoogleAdsAds { $customers = $this->googleOAuthService->getGoogleAdCustomers([]); foreach ($customers as $customerId) { - $resourceName = $this->googleAdsAdService->runListAds($customerId); + $googleAdsAdService = new GoogleAdsAdService($customerId); + $resourceName = $googleAdsAdService->runListAds($customerId); } // return $this->successResponse(['ads_list' => $resourceName]); diff --git a/app/event/GoogleAdsCampaigns.php b/app/event/GoogleAdsCampaigns.php index 1e86aef..b7d626e 100644 --- a/app/event/GoogleAdsCampaigns.php +++ b/app/event/GoogleAdsCampaigns.php @@ -19,12 +19,6 @@ use support\Redis; class GoogleAdsCampaigns { - /** - * @Inject - * @var GoogleAdsCampaignService - */ - - private $googleAdsCampaignService; /** * @Inject diff --git a/app/event/GoogleAdsDateDatas.php b/app/event/GoogleAdsDateDatas.php index 1ac30fb..5bb9d75 100644 --- a/app/event/GoogleAdsDateDatas.php +++ b/app/event/GoogleAdsDateDatas.php @@ -19,12 +19,6 @@ use support\Redis; class GoogleAdsDateDatas { - /** - * @Inject - * @var GoogleAdsCampaignService - */ - - private $googleAdsCampaignService; /** * @Inject @@ -67,7 +61,8 @@ class GoogleAdsDateDatas { $customers = $this->googleOAuthService->getGoogleAdCustomers([]); foreach ($customers as $customerId) { - $this->googleAdsCampaignService->runListDateDatas($customerId, $options['date']); + $googleAdsCampaignService = new googleAdsCampaignService($customerId); + $googleAdsCampaignService->runListDateDatas($customerId, $options['date']); } // $this->googleAdsCampaignService->runListDateDatas($options['customer_id'], $options['date']); diff --git a/app/event/GoogleAdsGroups.php b/app/event/GoogleAdsGroups.php index 6406c78..b3df2c5 100644 --- a/app/event/GoogleAdsGroups.php +++ b/app/event/GoogleAdsGroups.php @@ -20,13 +20,6 @@ use support\Redis; class GoogleAdsGroups { - /** - * @Inject - * @var GoogleAdsGroupService - */ - - private $googleAdsGroupService; - /** * @Inject * @var GoogleOAuthService diff --git a/app/middleware/Cros.php b/app/middleware/Cros.php index 2a1fa70..0b474d2 100644 --- a/app/middleware/Cros.php +++ b/app/middleware/Cros.php @@ -18,7 +18,7 @@ class Cros implements MiddlewareInterface 'Access-Control-Allow-Credentials' => 'true', 'Access-Control-Allow-Origin' => $request->header('origin', '*'), 'Access-Control-Allow-Methods' => $request->header('access-control-request-method', '*'), - 'Access-Control-Allow-Headers' => $request->header('access-control-request-headers', '*'), + 'Access-Control-Allow-Headers' => $request->header('access-control-request-headers', 'Authorization, Content-Length, X-CSRF-Token, Accept, Origin, Host, Connection, Accept-Encoding, Accept-Language, Keep-Alive, User-Agent, Content-Type'), ]); return $response; diff --git a/app/middleware/OauthCheck.php b/app/middleware/OauthCheck.php new file mode 100644 index 0000000..8a66183 --- /dev/null +++ b/app/middleware/OauthCheck.php @@ -0,0 +1,62 @@ +all(); // 获取请求数据 + $customerId = isset($requestData['ad_customer_id']) ? $requestData['ad_customer_id'] : getenv('GOOGLE_ADS_CUSTOMER_ID'); + // 通过 advertiser_id 查询 ThirdUserAdvertiser,联表查询 ThirdUser 数据 + $userAdvertiser = ThirdUserAdvertiser::with('googleUser') // 联表查询 user 关联 + ->where('advertiser_id', $customerId) // 根据 advertiser_id 查询 + ->find(); // 获取第一个结果 +// 如果找到广告主数据 + if ($userAdvertiser && $userAdvertiser->googleUser) { + // 获取关联用户的 access_token + $accessToken = $userAdvertiser->googleUser->access_token; + if (empty($accessToken)) { + return Json([ + 'code' => 300, + 'msg' => 'AccessToken 为空或过期', + 'data' => [] + ]); + } + $request->login_customer_id = $customerId; + $request->access_token = $accessToken; + } else { + return Json([ + 'code' => 300, + 'msg' => '未找到该广告主或关联的用户', + 'data' => [] + ]); + } + + +// if (session('user')) { +// // 已经登录,请求继续向洋葱芯穿越 +// return $handler($request); +// } + + // 通过反射获取控制器哪些方法不需要登录 +// $controller = new ReflectionClass($request->controller); +// $noNeedLogin = $controller->getDefaultProperties()['noNeedLogin'] ?? []; + + // 访问的方法需要登录 +// if (!in_array($request->action, $noNeedLogin)) { +// // 拦截请求,返回一个重定向响应,请求停止向洋葱芯穿越 +// return redirect('/user/login'); +// } + + // 不需要登录,请求继续向洋葱芯穿越 + return $handler($request); + } +} \ No newline at end of file diff --git a/app/service/GoogleOAuthService.php b/app/service/GoogleOAuthService.php index 14fb547..9457c38 100644 --- a/app/service/GoogleOAuthService.php +++ b/app/service/GoogleOAuthService.php @@ -87,6 +87,21 @@ class GoogleOAuthService ThinkDb::execute($sql, $data); } + public function updateRefreshToken($refreshToken) + { + $customer_id = getenv('GOOGLE_ADS_CUSTOMER_ID'); + //暂时update进行绑定 + $tableName = "bps.bps_third_user"; +// $sql = "UPDATE {$tableName} SET access_token = :access_token WHERE random_code = :random_code"; + $sql = "UPDATE {$tableName} SET access_token = :access_token WHERE user_id = :user_id"; + $data = [ + 'access_token' => $refreshToken, // 这里的 $accessToken 是您想要匹配的值 + 'user_id' => $customer_id, // 这里的 $accessToken 是您想要匹配的值 + ]; + // 执行 SQL 语句 + $result = ThinkDb::execute($sql, $data); + } + public function revokeToken($accessToken) { @@ -97,8 +112,17 @@ class GoogleOAuthService ], ]); - // 在数据库中删除或标记该`refresh_token`为无效 -// \App\Models\ThirdUser::where('access_token', $refreshToken)->delete(); + // 在数据库中删除或标记该`access_token(其实是refresh_token)`为无效 +// ThirdUserModel::where('access_token', $accessToken)->delete(); + $tableName = "bps.bps_third_user"; + $sql = "UPDATE {$tableName} SET access_token = '' WHERE access_token = :access_token"; + + $data = [ + 'access_token' => $accessToken // 这里的 $accessToken 是您想要匹配的值 + ]; + + // 执行 SQL 语句 + ThinkDb::execute($sql, $data); } public function useRefreshToken($refreshToken) diff --git a/config/route.php b/config/route.php index fbd75b0..55f0d58 100644 --- a/config/route.php +++ b/config/route.php @@ -39,7 +39,10 @@ Route::group('/googleads', function () { Route::post('/update', [AdController::class, 'updateAdStatus']); // Route::post('/get', [AdController::class, 'getAdStatus']); }); - }); + })->middleware([ + app\middleware\OauthCheck::class, + ]); + Route::group('/campaign', function () { Route::post('/list', [AdController::class, 'listCampaigns']); Route::post('/export', [AdController::class, 'exportCampaignsToExcel']); @@ -47,7 +50,9 @@ Route::group('/googleads', function () { Route::post('/update', [AdController::class, 'updateCampaignStatus']); // Route::post('/get', [AdController::class, 'getCampaignStatus']); }); - }); + })->middleware([ + app\middleware\OauthCheck::class, + ]); Route::group('/adgroup', function () { Route::post('/list', [AdController::class, 'listGroups']); Route::post('/export', [AdController::class, 'exportGroupsToExcel']); @@ -55,8 +60,9 @@ Route::group('/googleads', function () { Route::post('/update', [AdController::class, 'updateGroupStatus']); // Route::post('/get', [AdController::class, 'getGroupStatus']); }); - }); - + })->middleware([ + app\middleware\OauthCheck::class, + ]); Route::group('/auth', function () { Route::get('/code', [OAuthController::class, 'getAuthCode']); @@ -68,6 +74,7 @@ Route::group('/googleads', function () { }); }); + Route::group('/campaign', function () { Route::post('/create', [GoogleAdsController::class, 'createCampaign']); }); @@ -122,7 +129,7 @@ Route::fallback(function (Request $request) { 'Access-Control-Allow-Credentials' => 'true', 'Access-Control-Allow-Origin' => "*", 'Access-Control-Allow-Methods' => '*', - 'Access-Control-Allow-Headers' => '*', + 'Access-Control-Allow-Headers' => 'Authorization, Content-Length, X-CSRF-Token, Accept, Origin, Host, Connection, Accept-Encoding, Accept-Language, Keep-Alive, User-Agent, Content-Type', ]); return $response; }); diff --git a/config/thinkorm.php b/config/thinkorm.php index 79b9357..c98d4eb 100644 --- a/config/thinkorm.php +++ b/config/thinkorm.php @@ -59,6 +59,7 @@ return [ // 'schema' => 'public'// 设置默认 schema 'debug' => true, // 'fields_strict' => false, + 'fields_cache' => false, ], ], ];