use reqwest::{Client, Response};
use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::util::MiMa;
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct AuthToken {
#[serde(rename = "clienTid")]
pub client_id: String,
#[serde(rename = "clientSecret")]
pub client_secret: String,
pub username: String,
pub password: String,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct AuthTokenRes {
pub access_token: String,
pub expires_in: u64,
pub refresh_token: String,
pub uid: i64,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct AuthTokenRefresh {
#[serde(rename = "clienTid")]
pub client_id: String,
#[serde(rename = "clientSecret")]
pub client_secret: String,
#[serde(default = "AuthTokenRefresh::default_grant_type")]
pub grant_type: String,
pub refresh_token: String,
}
impl AuthTokenRefresh {
fn default_grant_type() -> String {
"refresh_token".to_string()
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct AuthTokenRefreshRes {
pub access_token: String,
pub expires_in: i64,
pub refresh_token: String,
}
impl MiMa for AuthToken {}
impl AuthToken {
pub async fn get(&self) -> AuthTokenRes {
let response = Client::new()
.post("https://cnapi.sciener.com/oauth2/token")
.header("Content-Type", "application/x-www-form-urlencoded")
.form(&self)
.send()
.await
.expect("获取锁的 AuthToken 请求发送失败");
response
.json::<AuthTokenRes>() .await
.expect("解析锁的 AuthTokenRes 失败")
}
pub async fn refresh(&self, refresh_token: String) -> AuthTokenRefreshRes {
let e = AuthTokenRefresh {
client_id: self.client_id.clone(),
client_secret: self.client_secret.clone(),
grant_type: AuthTokenRefresh::default_grant_type(),
refresh_token,
};
let response = Client::new()
.post("https://cnapi.sciener.com/oauth2/token")
.header("Content-Type", "application/x-www-form-urlencoded")
.form(&e)
.send()
.await
.expect("刷新锁的 AuthToken 发起请求失败");
response
.json::<AuthTokenRefreshRes>()
.await
.expect("解析 AuthTokenRefreshRes 失败")
}
}