You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust OAuth2 5.0.0版本后如何自定义ExtraTokenFields以获取Google的id_token

Rust OAuth2 5.0.0版本后如何自定义ExtraTokenFields以获取Google的id_token

哥们我太懂你遇到的这个坑了!OAuth2 5.0.0版本的类型严格化调整确实打了个措手不及,我当初升级的时候也卡了好一会儿。别慌,按下面几步来就能轻松搞定:

第一步:定义你的自定义额外字段结构体

首先得把要获取的id_token包装成一个结构体,还要实现两个必要的trait:serde::Deserialize(用来从响应JSON里解析字段)和oauth2::extra_fields::ExtraTokenFields(这个是标记用的空实现就行)。

别忘了在Cargo.toml里添加依赖:

serde = { version = "1.0", features = ["derive"] }
oauth2 = "5.0.0" # 或者你使用的对应版本

然后写结构体代码:

use oauth2::extra_fields::ExtraTokenFields;
use serde::Deserialize;

#[derive(Debug, Deserialize)]
struct GoogleAuthExtraTokenFields {
    id_token: String,
}

// 这个trait只需要空实现,告诉oauth2 crate这是个合法的额外字段类型
impl ExtraTokenFields for GoogleAuthExtraTokenFields {}

第二步:发起请求时显式指定自定义类型

之前的exchange_code默认用的是EmptyExtraTokenFields,所以返回的token里额外字段是空的。现在你需要在调用exchange_code时显式指定泛型参数为你的自定义结构体,这样oauth2 crate就知道要把响应里的id_token解析到你的结构体里了:

let token = client
    // 重点:这里的<>里填你的自定义额外字段类型
    .exchange_code::<GoogleAuthExtraTokenFields>(authorization_code)
    .set_pkce_verifier(pkce_verifier)
    .request_async(&http_client)
    .await
    .or(Err(/* 这里替换成你的错误处理逻辑,比如自定义Error枚举 */))?;

第三步:轻松获取id_token

请求成功后,token.extra_fields()返回的就是你的GoogleAuthExtraTokenFields实例了,直接访问id_token字段就行:

let google_id_token = &token.extra_fields().id_token;

最后提个关键小细节

别忘了在你申请授权的时候,一定要把openid加入到scope列表里!Google只有在看到这个scope的时候,才会在token响应里返回id_token,这个小坑很容易踩哦~

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 12:03:01