如何在Google Identity Token过期后延长用户会话至8小时?
Google Identity Services (GSI) 会话续期与Refresh Token问题解答
现状说明
已基于GSI实现Google登录,前端代码如下:
<html> <head> <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> <script src="https://accounts.google.com/gsi/client" async defer></script> <div id="g_id_onload" data-client_id="myclientid" data-login_uri="mysiteurl" data-auto_select="true"> </div> <div class="g_id_signin" data-type="filled_blue" data-size="large" data-theme="outline" data-text="sign_in_with" data-shape="pill" data-logo_alignment="left"> </div> </body> </html>
云函数中验证ID Token的Go代码片段:
import "google.golang.org/api/idtoken" func ListItems(w http.ResponseWriter, r *http.Request) { var googleClientId = os.Getenv("GOOGLE_CLIENTID") r.ParseForm() token := r.Form.Get("credential") payload, err := idtoken.Validate(context.Background(), token, googleClientId) // 后续验证逻辑... }
问题1:如何延长会话至8小时,无需用户重新认证
Google的ID Token有效期固定为1小时,无法直接修改时长。要实现8小时会话,需要引入自定义应用会话层,步骤如下:
- 首次验证:用户登录后,后端验证Google ID Token通过,生成自己的会话令牌(比如自定义JWT),设置有效期为8小时,通过HttpOnly、Secure的Cookie返回给前端。
- 后续请求:客户端调用云函数时,携带这个自定义会话令牌(而非Google的credential)。
- 令牌续期:在每次请求时检查自定义令牌的剩余有效期,若剩余时间不足(比如小于1小时),则自动生成新的会话令牌并更新前端Cookie,实现无感知续期。
问题2:GSI是否生成Refresh Token?如何获取
当前使用的GSI HTML按钮默认流程不会返回Refresh Token,这是因为该流程属于隐式授权模式的简化版,仅返回短期ID Token和Access Token(若指定了scope)。要获取Refresh Token,需切换到授权码流程:
- 前端调整:使用GSI的JS API发起授权请求,必须指定
access_type=offline和prompt=consent参数,确保Google返回授权码。 - 前端将授权码发送到后端云函数。
- 后端用授权码、客户端ID、客户端密钥(Web应用需妥善保管密钥)向Google令牌端点请求,交换得到ID Token、Access Token和Refresh Token。
- 后端加密存储Refresh Token,后续可通过它向Google请求新的ID Token,无需用户重新登录。
内容的提问来源于stack exchange,提问作者Tom Scheifler
相关产品推荐
相关产品推荐

