14个稳定版本
| 1.11.0 | 2024年4月19日 |
|---|---|
| 1.10.1 | 2024年2月3日 |
| 1.8.0 | 2023年11月16日 |
| 1.1.0 | 2023年5月8日 |
#151 in Web编程
1,210 monthly downloads
43KB
777 行
Google-Oauth
描述
Google-Oauth 是一个用于Google oauth2的服务器端验证库。
Google-Oauth 可以帮助您验证从Google生成的 id_token 或 access_token。
使用方法(异步)
1. 配置
要将 Google-Oauth 添加到您的项目中,请将以下行添加到您的 Cargo.toml 中。
[dependencies]
google-oauth = { version = "1" }
如果您决定使用 async 函数,请选择一个 async 运行时。这里有一些选项供您选择
我们在示例中使用 tokio,并重构了我们的主函数如下
#[tokio::main]
// #[async_std::main] // when you use [async-std]
// #[actix_web::main] // when you use [actix-web]
async fn main() {}
2. 执行验证(id_token)
您可以从Google管理控制台(或其它地方)获取您的 client_id,并且用户已经提供了一个 id_token。它们都是 字符串类型。使用以下代码进行验证
use google_oauth::AsyncClient;
#[tokio::main]
async fn main() {
let client_id = "your client id";
let id_token = "the id_token";
let client = AsyncClient::new(client_id);
/// or, if you want to set the default timeout for fetching certificates from Google, e.g, 30 seconds, you can:
/// ```rust
/// let client = AsyncClient::new(client_id).timeout(time::Duration::from_sec(30));
/// ```
let payload = client.validate_id_token(id_token).await.unwrap(); // In production, remember to handle this error.
// When we get the payload, that mean the id_token is valid.
// Usually we use `sub` as the identifier for our user...
println!("Hello, I am {}", &payload.sub);
// If you have multiple client ids, you can:
let client = AsyncClient::new_with_vec(vec![client_id]);
// The validation fails when the id_token matches NONE of the provided client ids.
}
不提供任何客户端ID进行验证
当没有为 AsyncClient 提供任何 client_id 时,验证 id_token 时将不会使用 client_id。在这种情况下,AsyncClient 将接受所有 client_id。然而,Google发行者(iss)、过期时间(exp)和JWT哈希 不能 跳过。
3. 执行验证(AccessToken)
有时,Google会返回一个 access_token 而不是 id_token。 Google-Oauth 仍然提供用于验证从Google获取的 access_token 的API。
注意:当验证 access_token 时,我们不关心 client_id。所以,如果你只需要验证 access_token,你可以简单地传递一个空的 client_id,就像这样
use google_oauth::AsyncClient;
#[tokio::main]
async fn main() {
let access_token = "the access_token";
let client = AsyncClient::new("");
let payload = client.validate_access_token(access_token).await.unwrap(); // In production, remember to handle this error.
// When we get the payload, that mean the id_token is valid.
// Usually we use `sub` as the identifier for our user...
println!("Hello, I am {}", &payload.sub);
}
警告:access_token 的结果与 id_token 的结果不同,尽管它们有一个相同的字段 sub。
完整示例,请查看 ./example/async_client/
支持的算法
对于验证 id_token,Google 可能会使用这两种哈希算法来生成 JWTs
- RS256
- ES256
然而,我找不到获取有效 ES256 令牌的方法,因此我留下了一个 unimplemented 分支,并在 JWT 是 ES256 哈希时返回一个 Err。
如果您有示例,请随时创建一个新问题。PR 欢迎使用。
用法(阻塞)
Google-Oauth 还提供了一个阻塞客户端。您需要启用 blocking 功能
[dependencies]
google-oauth = { version = "1", features = ["blocking"] }
您可以使用 google_oauth::Client 来验证令牌
use google_oauth::Client;
fn main() {
let client_id = "your client id";
let id_token = "the id_token";
let client = Client::new(client_id);
let payload = client.validate_id_token(id_token).unwrap();
println!("Hello, I am {}", &payload.sub);
}
完整示例,请查看 ./examples/blocking/
WebAssembly (wasm)
Google-Oauth 支持 wasm,需要 wasm 功能。
[dependencies]
google-oauth = { version = "1", features = ["wasm"] }
您可以使用 wasm-pack build --features wasm 来构建此库。(cargo install wasm-pack 首先安装。)
如果您需要将 wasm 导入到您的项目中,您可以使用 google_oauth::Client 来运行异步函数。
功能
default:启用AsyncClient。blocking:启用Client。wasm:禁用AsyncClient和Client(blocking),启用Client(wasm)。reqwest-rustls:使用 rustls 作为 Reqwest 客户端的 TLS 后端
依赖项
~8–21MB
~340K SLoC