首页 > 解决方案 > 在 Rust 中验证 Google 登录 ID 令牌

问题描述

我有兴趣验证在成功尝试 Google 登录时返回的 Google ID 令牌。我有一个基于 Rust 的 web 应用程序,我在其中:

  1. 通过 Javascript 提供 Google 登录,在成功验证后,我会返回一个 Google ID 令牌。

  2. 我的 Javascript 代码将此 Google ID 令牌连同其他信息(即用户的帐户 ID、当前电子邮件等)一起提交到我的后端服务器(用 Rust 编写)。

  3. 我想通过 Google 官方文档https://developers.google.com/identity/sign-in/web/backend-auth中引用的说明验证此 ID 令牌的完整性,然后我才能“信任”提交的用户信息(即用户的帐户 ID、当前电子邮件等)是有效的,不是恶意请求。

  4. 我想要实现的示例:验证 Google Id 令牌

我试过的:

  1. 到目前为止,我尝试使用https://lib.rs/crates/google-signin没有运气,因为在尝试将其用作 dep 时出现以下错误:
cargo check
    Updating crates.io index
error: failed to select a version for the requirement `untrusted = "^0.5"`
candidate versions found which didn't match: 0.7.1, 0.7.0, 0.6.2
location searched: crates.io index
required by package `webpki-roots v0.10.0`
    ... which is depended on by `hyper-rustls v0.6.0`
    ... which is depended on by `google-signin v0.3.0`
    ... which is depended on by `<my project> v0.0.1 (<my project>)`

似乎 crate 与 repo 的链接已损坏,因此无法提交问题。

  1. 我已经尝试过https://github.com/Byron/google-apis-rs但我似乎无法在生成的输出中找到可用的代码。

人们用什么来验证 Rust 中的 ID 令牌?

标签: rustgoogle-oauth

解决方案


不幸的是,没有官方的 sdk 用于 rust,而且这 2 个也不好,因为它们使用令牌追溯端点进行验证,所以每个令牌验证都会有延迟。

最好在本地获取和缓存 jwks 并验证,到目前为止我发现的最好的 crate 是https://crates.io/crates/jwks-client。我对 Firebase ID 令牌感兴趣,所以 jwks 网址是https://www.googleapis.com/service_accounts/v1/jwk/securetoken@system.gserviceaccount.com。它工作正常,但有一些严重的限制:

  • 它不会自动刷新密钥,因此您需要实现一个守护进程,它会定期获取密钥。这非常重要,因为根据我的经验,谷歌确实经常轮换 jwks。
  • 它不是线程安全的,因为底层密钥存储是一个简单的向量,所以你需要扩展它一点

此外https://medium.com/@maylukas/firebase-token-authentication-in-rust-a1885f0982df似乎是一个非常有用的指南


推荐阅读