验证授权和解绑的refreshtoken更新

This commit is contained in:
hgc 2024-12-24 17:31:48 +08:00
parent a37d7ae901
commit 1f1d7b9bd1
10 changed files with 127 additions and 40 deletions

View File

@ -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']);

View File

@ -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]);

View File

@ -19,12 +19,6 @@ use support\Redis;
class GoogleAdsCampaigns
{
/**
* @Inject
* @var GoogleAdsCampaignService
*/
private $googleAdsCampaignService;
/**
* @Inject

View File

@ -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']);

View File

@ -20,13 +20,6 @@ use support\Redis;
class GoogleAdsGroups
{
/**
* @Inject
* @var GoogleAdsGroupService
*/
private $googleAdsGroupService;
/**
* @Inject
* @var GoogleOAuthService

View File

@ -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;

View File

@ -0,0 +1,62 @@
<?php
namespace app\middleware;
use app\model\ThirdUserAdvertiser;
//use ReflectionClass;
use Webman\MiddlewareInterface;
use Webman\Http\Response;
use Webman\Http\Request;
class OauthCheck implements MiddlewareInterface
{
public function process(Request $request, callable $handler): Response
{
$requestData = $request->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);
}
}

View File

@ -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)

View File

@ -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;
});

View File

@ -59,6 +59,7 @@ return [
// 'schema' => 'public'// 设置默认 schema
'debug' => true,
// 'fields_strict' => false,
'fields_cache' => false,
],
],
];