43 lines
1.6 KiB
Rust
43 lines
1.6 KiB
Rust
use chrono::Utc;
|
|
use domain::dto::account::AuthenticateGooleAccountReq;
|
|
use domain::entities::account::Account;
|
|
use library::{db, token};
|
|
use library::resp::response::ResErr::ErrPerm;
|
|
use library::resp::response::{ResErr, ResOK, ResResult};
|
|
use library::social::google::GOOGLE_SOCIAL;
|
|
|
|
pub async fn authticate_google(req: AuthenticateGooleAccountReq) -> ResResult<ResOK<(String, String)>> {
|
|
let verify_result = GOOGLE_SOCIAL.verify_id_token(&req.id_token.unwrap()).await.map_err(|err| {
|
|
tracing::error!(error = ?err, "校验Google Token失败");
|
|
ErrPerm(None)
|
|
})?;
|
|
|
|
let account = Account::find_by_google_id(&verify_result.aud, db!()).await?;
|
|
let account = match account {
|
|
None => {
|
|
tracing::info!("账户不存在, {:?}", verify_result);
|
|
Account::save_google_account(
|
|
&Account {
|
|
username: verify_result.name,
|
|
google_id: Some(verify_result.aud),
|
|
email: Some(verify_result.email),
|
|
display_name: Some(verify_result.given_name),
|
|
avatar_url: Some(verify_result.picture),
|
|
..Default::default()
|
|
}, db!()).await?
|
|
}
|
|
Some(account) => {
|
|
tracing::info!("账户已存在, {:?}", account);
|
|
if account.disable_time > Utc::now() {
|
|
tracing::error!("账户已禁用");
|
|
return Err(ResErr::system("账户已禁用"));
|
|
}
|
|
account
|
|
}
|
|
};
|
|
|
|
return Ok(ResOK(Some((
|
|
token::generate_token(&account.id),
|
|
token::generate_refresh_token(&account.id),
|
|
))));
|
|
} |