使用Sign in with Google集成登录时nonce参数该如何正确使用?
你可按照以下步骤在现有流程中集成nonce参数:
- 调整原有流程第1步:渲染登录按钮前,先在服务端为当前未登录用户生成加密安全的随机nonce值,长度建议不小于16字节,将该nonce和当前用户的临时会话绑定存储(可关联一个HttpOnly的预登录Cookie存在服务端临时缓存),同时将nonce传递给前端页面。
调用JS API渲染Google登录按钮时,在配置参数中加入nonce字段,值为服务端下发的对应nonce即可。 - 原有流程的第2、3步无需修改:登录流程完成后返回的
.credentials(即ID Token)的payload中会自动携带你之前传入的nonce值,前端照常将该字符串提交到后端即可。 - 调整原有流程第4步:调用
OAuth2Client.verifyIdtoken方法校验ID Token时,在入参配置中新增expectedNonce字段,值为当前用户临时会话中存储的对应nonce,SDK会自动完成nonce一致性校验,校验不通过会直接抛出错误,无需手动解析JWT比对。 - 校验完成后立即销毁当前会话中存储的nonce,确保每个nonce仅可使用一次。
注意事项
- nonce必须使用加密安全的随机生成器生成,禁止使用时间戳、自增ID等可预测的值作为nonce。
- 不要将nonce存储在LocalStorage等易被XSS攻击窃取的位置,优先存在服务端会话中,仅在渲染按钮时传递给前端一次。
- 增加nonce校验后可有效防范两类安全风险:一是ID Token重放攻击,攻击者即使窃取到用户未过期的ID Token,没有匹配的nonce也无法完成登录;二是跨站请求伪造(CSRF)攻击,第三方站点无法获取到当前用户会话对应的合法nonce,无法构造有效登录请求。
内容的提问来源于stack exchange,提问作者Kannan Goundan
相关产品推荐
相关产品推荐

