我的项目基于Yii2构建,并使用google/apiclient
登录Web界面。还有一个Android应用程序,该应用程序连接到API并针对Google令牌使用承载身份验证(我相信将其引入firebase/jwt
中)。从2018年初到2018年9月10日这一周,这种方法一直很好。在我的系统中没有更改任何代码。
从那时起,尝试登录Web界面(oAuth)即可提供
yii \ authclient \ InvalidResponseException:请求失败,代码:400,消息:{ “错误”:“ redirect_uri_mismatch”, “ error_description”:“错误请求”
该网站已正确列出在Google开发者控制台中(我也没有进行任何更改),因此redirect_uri_mismatch
是不可预期的。
升级google/apiclient
可使我登录到Web界面,但中断了应用程序的令牌身份验证,给出:
您的请求是使用无效的凭据
如果需要,我可以提供完整的堆栈跟踪,但是,我希望其他人也遇到了同样的情况,并可以指出正确的方向。在实时系统中使用firebase/jwt
v4可以使令牌身份验证起作用,但是在升级后的google/apiclient
的测试中使用v4会使身份验证失败,验证错误与上述相同。
任何人都可以提供任何指导吗?
答案 0 :(得分:0)
要在首次登录时获取刷新令牌,需要在“ authUrl”中设置“?access_type = offline”。然后将其保存在数据库,文件等中的某个位置。
如果您没有数据库,或者每次登录时都提示输入访问权限,则可以将“&approval_prompt = force”添加到同一URL。那将强制Google每次登录时向您发送刷新令牌,而且还会强制每次显示访问权限提示。
class MyGoogleClient extends yii\authclient\clients\Google
{
/**
* Set to true if you want to get refresh token always on login
* @var type
*/
public $enforceRefreshToken = false;
/**
* {@inheritdoc}
*/
public function init()
{
parent::init();
if (is_array($this->scope)) {
$this->scope = implode(' ', $this->scope);
}
$additionalParams = [];
if ($this->autoRefreshAccessToken) {
$additionalParams['access_type'] = 'offline';
}
if ($this->enforceRefreshToken) {
$additionalParams['approval_prompt'] = 'force';
}
if (!empty($additionalParams)) {
$this->authUrl = $this->composeUrl($this->authUrl, $additionalParams);
}
}
/**
* {@inheritdoc}
* @return string return URL.
*/
protected function defaultReturnUrl()
{
return Yii::$app->getUrlManager()->createAbsoluteUrl([Yii::$app->controller->getRoute(), 'authclient' => 'google']);
}
}