baseid_oid4vci/
token.rs

1//! Token and nonce endpoint types for OID4VCI.
2
3use serde::{Deserialize, Serialize};
4
5/// Token response from the authorization server.
6#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct TokenResponse {
8    pub access_token: String,
9    pub token_type: String,
10    #[serde(skip_serializing_if = "Option::is_none")]
11    pub expires_in: Option<u64>,
12    /// Challenge nonce (legacy — in OID4VCI 1.0, use nonce endpoint instead).
13    #[serde(skip_serializing_if = "Option::is_none")]
14    pub c_nonce: Option<String>,
15    #[serde(skip_serializing_if = "Option::is_none")]
16    pub c_nonce_expires_in: Option<u64>,
17}
18
19/// Nonce response from the nonce endpoint (OID4VCI 1.0).
20#[derive(Debug, Clone, Serialize, Deserialize)]
21pub struct NonceResponse {
22    pub c_nonce: String,
23}
24
25#[cfg(test)]
26mod tests {
27    use super::*;
28
29    #[test]
30    fn token_response_full_roundtrip() {
31        let resp = TokenResponse {
32            access_token: "tok".to_string(),
33            token_type: "Bearer".to_string(),
34            expires_in: Some(3600),
35            c_nonce: Some("nonce".to_string()),
36            c_nonce_expires_in: Some(300),
37        };
38        let json = serde_json::to_string(&resp).unwrap();
39        let parsed: TokenResponse = serde_json::from_str(&json).unwrap();
40        assert_eq!(parsed.access_token, "tok");
41        assert_eq!(parsed.c_nonce.as_deref(), Some("nonce"));
42    }
43
44    #[test]
45    fn token_response_minimal() {
46        let json = r#"{"access_token":"a","token_type":"Bearer"}"#;
47        let resp: TokenResponse = serde_json::from_str(json).unwrap();
48        assert!(resp.expires_in.is_none());
49        assert!(resp.c_nonce.is_none());
50    }
51
52    #[test]
53    fn nonce_response_roundtrip() {
54        let resp = NonceResponse {
55            c_nonce: "abc123".to_string(),
56        };
57        let json = serde_json::to_string(&resp).unwrap();
58        let parsed: NonceResponse = serde_json::from_str(&json).unwrap();
59        assert_eq!(parsed.c_nonce, "abc123");
60    }
61}