我有一个Web应用程序,用户可以在其中sign in with Google
。
在登录过程中,我添加了一个能够访问 Google 日历的范围。
现在用户已登录,我想在服务器端获取他们当前的 Google 访问令牌,以便发出请求并获取其事件列表。
有没有办法获取当前的 OAuth 令牌(不需要刷新令牌),以便我完全在服务器端执行此操作?
我想说的是,您可以查看本文并特别注意对网站的推荐。
我知道您已经配置了同意屏幕,这是使用 OAuth 2.0 的基本步骤的第一步。因此,我知道您只需要执行以下步骤:
- 从谷歌授权服务器获取访问令牌
- 检查用户授予的访问范围。
- 将访问令牌发送到 API
我认为您还可以查看其他文档,以获取有关使用用户令牌授权请求的目标的更多 GCP 见解
已编辑: 关于Firebase身份验证,我知道这种情况发生在用户的设备上,您可以使用一些代码来检索令牌,然后将其发送到后端服务器,如此处所述。
作为示例,这里有用于在 Android 中检索令牌的示例代码:
FirebaseUser mUser = FirebaseAuth.getInstance().getCurrentUser();
mUser.getIdToken(true)
.addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
public void onComplete(@NonNull Task<GetTokenResult> task) {
if (task.isSuccessful()) {
String idToken = task.getResult().getToken();
// Send token to your backend via HTTPS
// ...
} else {
// Handle error -> task.getException();
}
}
});
关于OAuth 2.0的一点
每当用户通过Google或第三方(Authorization Code
)注册您的应用程序/网站时,此授权码将交换为AccessToken
和RefreshToken
。
通过谷歌发送的AccessToken
的有效期一般为60分钟。
离线访问(服务器端)
让我们将其分解为两部分:
如果您需要在用户上次活动后的 60 分钟内更新
您可以使用Firebase和gapi来实现这一点。您将获得可以发送回服务器以添加到日历的AccessToken
。
有关实施的更多信息
如果您需要在用户上次活动 60 分钟后进行更新
Firebase 和 gapi 的大多数方法在内部处理AuthorizationCode
流。他们甚至在 60 分钟后进一步刷新AccessToken
。这对大多数开发人员来说是有益的,因为他们不会为管理所有代币而头疼。
但是,此方法对开发人员隐藏了RefreshToken
和AuthorizationCode
。也就是说,即使您的服务器具有访问令牌,它也无法刷新它,并且会被视为无用。
要实现完全脱机访问,在获取AuthorizationCode
的初始请求中,您需要将 HTTP GET 参数access_type
发送到offline
GAPI 为您提供了 grantOfflineAccess() 方法,该方法返回稍后可以在您的服务器上用于获取访问令牌和刷新令牌的AuthorizationCode
。
注意:如果要将AuthorizationCode
存储在数据库中,请确保它是安全的。Firebase 中的限制是出于安全原因而设置的。通常不与授权代码交谈更安全。
更多链接
- https://developers.google.com/identity/protocols/oauth2/web-server
- https://developers.google.com/identity/sign-in/web/reference
- https://developers.google.com/identity/sign-in/web/server-side-flow
- https://developers.google.com/identity/sign-in/web/backend-auth
- 在使用 Firebase 身份验证进行身份验证后检索 Google 访问令牌