Firebase中GoogleAuthProvider返回的AccessToken过期后如何无感刷新?
你混淆了两种不同体系的访问凭证,这是你遇到问题的根本原因,以下是两个疑问的对应解答:
1. 如何正确刷新ya29开头的access token
你当前存储的ya29.开头的access token是Google OAuth 2.0服务签发的第三方访问凭证,不属于Firebase体系内的凭证,Firebase没有原生提供刷新该凭证的能力,需要通过Google OAuth的标准流程刷新:
- 初始化
GoogleAuthProvider时添加离线访问参数,确保能拿到Google签发的refresh token:
provider = new firebase.auth.GoogleAuthProvider(); // 新增以下配置,首次授权时加prompt: consent才会返回refresh token provider.setCustomParameters({ access_type: 'offline', prompt: 'consent' })
- 登录成功后,除了存储
userCredential.credential.accessToken,还要同时存储userCredential.credential.refreshToken(注意这是Google的refresh token,不是Firebase用户对象的user.refreshToken)以及token的过期时间(默认3600秒)。 - token快过期时,调用Google OAuth刷新接口获取新的
ya29.开头的access token,请求参数如下:- 接口地址:
https://oauth2.googleapis.com/token - 请求方式:POST
- 必传参数:
grant_type: 固定值refresh_tokenrefresh_token: 你提前存储的Google refresh tokenclient_id: 你Firebase项目配置中对应的Google OAuth客户端IDclient_secret: 对应Google OAuth客户端的密钥
返回的新access token即可正常通过https://www.googleapis.com/oauth2/v1/tokeninfo接口校验。
- 接口地址:
2. securetoken接口返回的令牌说明
你调用的securetoken.googleapis.com是Firebase Auth体系的官方刷新接口,返回的令牌不属于Google OAuth体系,自然不会以ya29.开头,这类令牌是Firebase签发的ID令牌,本质是JWT格式,通常以eyJh开头,作用如下:
- 仅用于验证用户是否为你当前Firebase项目的合法注册用户
- 可用于调用Firebase的各类云服务(如云存储、云函数、实时数据库等)的身份校验
- 若要在你的Flask后端校验该类令牌,需要接入Firebase Admin SDK进行验签,无法通过Google的oauth2 tokeninfo接口校验
- 你传入该接口的refresh token是Firebase体系的用户刷新凭证,和Google的refresh token完全独立,不能混用。
内容的提问来源于stack exchange,提问作者Vladislav Kasintsev
相关产品推荐
相关产品推荐

