yii2:使用google / apiclient进行oAuth和令牌身份验证时遇到问题

时间:2018-09-22 09:13:27

标签: php google-api yii2 google-authentication

我的项目基于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会使身份验证失败,验证错误与上述相同。

任何人都可以提供任何指导吗?

1 个答案:

答案 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']);
        }

    }