我正在尝试使用google oAuth使用以下代码进行授权请求
$client = new Google_Client();
$client->setClientId('qweqweqweqwe');
$client->setClientSecret('vQWsd1Geweqweqweqwe');
$client->setRedirectUri('http://localhost/test1');
$client->setAccessType('offline');
$client->setApprovalPrompt('force');
$client->setScopes(['https://www.googleapis.com/auth/gmail.readonly']);
if (request()->has('code')) {
$credentials = $client->authenticate(request('code'));
dd($credentials);
}
它的工作原理,但我的问题是:有没有办法在请求中添加用户ID并将其恢复回调?
答案 0 :(得分:1)
添加该参数的一个非常好的观点是也可以防止csrf攻击。
如何在谷歌授权请求中添加参数,然后从谷歌回复请求回调请求,方法是设置base64
编码的json有效负载:
在生成Authorization url之前,首先要包含两个函数来编码和解码url params,简单:
public function base64UrlEncode($inputStr)
{
return strtr(base64_encode($inputStr), '+/=', '-_,');
}
public function base64UrlDecode($inputStr)
{
return base64_decode(strtr($inputStr, '-_,', '+/='));
}
向Google发出oauth请求,请使用url params示例:
$params = base64UrlEncode('{ "a" : "b" , "c" : 1 }');
在Google Client类中,您需要在创建网址之前调用函数setState($state)
,并将$params
作为参数传递给:
$client = new Google_Client();
$client->setClientId('qweqweqweqwe');
$client->setClientSecret('vQWsd1Geweqweqweqwe');
$params = base64UrlEncode('{ "a" : "b" , "c" : 1 }');
$client->setState($params);
$client->setRedirectUri('http://localhost/test1');
然后响应将具有状态请求参数,因此在回调路由中执行:
Route::get('/callback', function(){
$state = request()->get('state'); // GET['state'];
$state = base64_decode(strtr($state, '-_,', '+/='));
dd($state); // will output your params
});
这个答案有点基于: here
答案 1 :(得分:0)
您可以使用state
通过Google_Client::setState()
发送自定义参数。
设置客户时:
$client = new Google_Client();
$client->setClientId('qweqweqweqwe');
$client->setClientSecret('vQWsd1Geweqweqweqwe');
$client->setRedirectUri('http://localhost/test1');
$client->setState('test=value');
在回调中,参数将在state
到GET:
var_dump($_GET["state"]); // test=value
您可以随意发送任何内容,因此如果数据过于复杂,请尝试json_encode()
或url_encode()
您的数据。
答案 2 :(得分:-1)
您可以将用户ID添加到回拨网址:
$ client-> setRedirectUri(' http://localhost/test1/'。$ user_id);