gpt4 book ai didi

Firebase Google Auth离线access_type以便刷新 token

转载 作者:行者123 更新时间:2023-12-04 03:37:19 25 4
gpt4 key购买 nike

我们正在将Firebase与Google身份验证配合使用。我们之所以选择Google,是因为我们的应用程序调用了Google API。我们使用从Firebase返回的授权有效负载中包含的access_token对这些api调用进行授权。但是,我们在弄清楚access_token过期后如何刷新时遇到了麻烦。根据Google的说法,我们应该假设access_token可能由于各种原因而过期。

因此,(据我所知),我们需要一种方法来刷新此 token ,而不必强制用户重新授权。理想情况下,我可以在请求Firebase身份验证时请求脱机access_type ...但我不知道如何执行此操作(除非再次触发firebase.authWithOAuthPopup(...),我们绝对不希望在用户 session 时执行此操作显然仍然有效。

是否可以通过Firebase获取脱机的access_type Google oauth token ,以便Google返回return_token(https://developers.google.com/accounts/docs/OAuth2WebServer#formingtheurl)?有了refresh_token,我想可以为api调用获取一个新的access_token。

我正在尝试此操作,但绝对不支持:

this.firebase.authWithOAuthPopup("google", this.authenticateGoogle.bind(this), {
access_type: 'offline', <-- not passed to Google
scope: 'https://www.googleapis.com/auth/userinfo.profile, https://www.googleapis.com/auth/devstorage.read_write'
});

所有对 https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=abcd的调用都将access_type显示为在线。

谢谢

最佳答案

一种最大限度地减少服务器端实现要求的解决方案。

TL:DR; 使用Google Sign-In for Websites库生成身份验证凭据。使用身份验证凭据登录Firebase,然后将脱机访问交换代码发布到您的服务器。

客户端

客户端,我通过包含以下内容实现了Google Sign-In for Websites:

<script src="https://apis.google.com/js/platform.js?onload=loadAuth2" async defer></script>
<script>
function loadAuth2 () {
gapi.load('auth2', function() {
gapi.auth2.init({
client_id: 'your firebase Web client ID',
cookie_policy: 'single_host_origin',
scope: 'profile ...'
});
});
}
</script>

注意:范围应该是用空格分隔的所需访问范围的列表。

假设Firebase已加载,我的登录单击处理程序为:
<script>
function login() {
const auth = gapi.auth2.getAuthInstance();
auth.then(() => {
auth.grantOfflineAccess({
'redirect_uri': 'postmessage',
'prompt': 'concent',
'approval_prompt': 'force',
}).then(offlineAccessExchangeCode => {
// send offline access exchange code to server ...

const authResp = auth.currentUser.get().getAuthResponse();
const credential = firebase.auth.GoogleAuthProvider.credential(authResp.id_token);
return firebase.auth().signInWithCredential(credential);
}).then(user => {
// do the thing kid!
});
});
}
</script>

使用 auth.grantOfflineAccess调用 'redirect_uri': 'postmessage'会导致Google auth2库通过 window.postMessage将身份验证凭据传递回您的Web应用程序。 See here for the auth2 library reference

在我的应用程序的其他地方,我正在监听Firebase身份验证状态的更改。
firebase.auth().onAuthStateChanged(user => {
if (user) {
// navigate to logged in state
} else {
// navigate to login page
}
});

服务器端

我将 POST (看起来像 offlineAccessExchangeCode) {"code": "..."}到我的服务器,以交换当前已认证用户的凭证,其中包括刷新 token 。虽然客户端可以访问 firebase.auth().currentUser.refreshToken,但此 token 对我不起作用(也许有人可以告诉我,我在这里误会了:D)

我的Python服务器端代码如下。请注意,Google SDK是为大多数Google服务自动生成的,因此以下代码应可以轻松转换为它们支持的任何语言。
from oauth2client import client
// ...
// assuming flask
@app.route("/google/auth/exchange", methods=['POST'])
def google_auth_exchange():
auth_code = request.get_json()['code']
credentials = client.credentials_from_clientsecrets_and_code(
'config/client_secret.json', ['profile', '...'], auth_code)

print(credentials.refresh_token)

就是这样。如果您需要脱机访问,我会假设您具有服务器或某些服务器端代码,因此希望实现路由距离理想的解决方案不太远。

排序

注意: GCLID解析器是我目前正在从事的项目,需要此项目。

关于Firebase Google Auth离线access_type以便刷新 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27890737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com