我在使用 Google 助理的 OAuth 隐式流程时遇到问题。我设法设置了一个 OAuth 服务器并让它工作。这是流程:
用户被重定向到我的端点,使用 Google 帐户进行身份验证,并使用访问令牌和结果代码=SUCCES 将其发送回助手。
在我的完成中,我通过向以下地址发出 https 请求来获取用户的电子邮件地址:https://www.googleapis.com/plus/v1/people/me?access_token=access_token
。
然后我在我的数据库中找到匹配的用户并将访问令牌添加到该用户的数据库中。
下次用户登录时,我会检查访问令牌并用他们的名字问候用户。
现在的问题是这是隐式流,根据文档应该有一个永不过期的访问令牌:
注意:Google 要求使用隐式流发布的访问令牌永不过期,因此您不需要像其他 OAuth 2.0 流那样记录访问令牌的授予时间。
但是助手强迫我每小时重新验证一次,这意味着访问令牌确实过期了。
我的问题是:这个流程是正确的还是我错过了什么?我在 OAuth 端点中做错了什么吗?
我的端点基于https://developers.google.com/identity/protocols/OAuth2UserAgent。
<html>
<head>
<script src="https://apis.google.com/js/platform.js" async defer></script>
<meta name="google-signin-client_id" content="CLIENT_ID">
</head>
<body>
<script>
var YOUR_CLIENT_ID = 'CLIENT_ID';
function oauth2SignIn() {
// Google's OAuth 2.0 endpoint for requesting an access token
var oauth2Endpoint = 'https://accounts.google.com/o/oauth2/v2/auth';
// Create element to open OAuth 2.0 endpoint in new window.
var form = document.createElement('form');
form.setAttribute('method', 'GET'); // Send as a GET request.
form.setAttribute('action', oauth2Endpoint);
//Get the state and redirect_uri parameters from the request
var searchParams = new URLSearchParams(window.location.search);
var state = searchParams.get("state");
var redirect_uri = searchParams.get("redirect_uri");
//var client_id = searchParams.get("client_id");
// Parameters to pass to OAuth 2.0 endpoint.
var params = {
'client_id': YOUR_CLIENT_ID,
'redirect_uri': redirect_uri,
'scope': 'email',
'state': state,
'response_type': 'token',
'include_granted_scopes': 'true'
};
// Add form parameters as hidden input values.
for (var p in params) {
var input = document.createElement('input');
input.setAttribute('type', 'hidden');
input.setAttribute('name', p);
input.setAttribute('value', params[p]);
form.appendChild(input);
}
// Add form to page and submit it to open the OAuth 2.0 endpoint.
document.body.appendChild(form);
form.submit();
}
oauth2SignIn();
</script>
</body>
</html>