mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-28 20:23:43 +08:00
feat(users): add endpoint to check 2fa status (#4810)
This commit is contained in:
@ -16,8 +16,9 @@ use crate::user::{
|
|||||||
GetUserRoleDetailsResponse, InviteUserRequest, ListUsersResponse, ReInviteUserRequest,
|
GetUserRoleDetailsResponse, InviteUserRequest, ListUsersResponse, ReInviteUserRequest,
|
||||||
RecoveryCodes, ResetPasswordRequest, RotatePasswordRequest, SendVerifyEmailRequest,
|
RecoveryCodes, ResetPasswordRequest, RotatePasswordRequest, SendVerifyEmailRequest,
|
||||||
SignInResponse, SignUpRequest, SignUpWithMerchantIdRequest, SwitchMerchantIdRequest,
|
SignInResponse, SignUpRequest, SignUpWithMerchantIdRequest, SwitchMerchantIdRequest,
|
||||||
TokenOrPayloadResponse, TokenResponse, UpdateUserAccountDetailsRequest, UserFromEmailRequest,
|
TokenOrPayloadResponse, TokenResponse, TwoFactorAuthStatusResponse,
|
||||||
UserMerchantCreate, VerifyEmailRequest, VerifyRecoveryCodeRequest, VerifyTotpRequest,
|
UpdateUserAccountDetailsRequest, UserFromEmailRequest, UserMerchantCreate, VerifyEmailRequest,
|
||||||
|
VerifyRecoveryCodeRequest, VerifyTotpRequest,
|
||||||
};
|
};
|
||||||
|
|
||||||
impl ApiEventMetric for DashboardEntryResponse {
|
impl ApiEventMetric for DashboardEntryResponse {
|
||||||
@ -73,6 +74,7 @@ common_utils::impl_misc_api_event_type!(
|
|||||||
GetUserRoleDetailsRequest,
|
GetUserRoleDetailsRequest,
|
||||||
GetUserRoleDetailsResponse,
|
GetUserRoleDetailsResponse,
|
||||||
TokenResponse,
|
TokenResponse,
|
||||||
|
TwoFactorAuthStatusResponse,
|
||||||
UserFromEmailRequest,
|
UserFromEmailRequest,
|
||||||
BeginTotpResponse,
|
BeginTotpResponse,
|
||||||
VerifyRecoveryCodeRequest,
|
VerifyRecoveryCodeRequest,
|
||||||
|
|||||||
@ -235,6 +235,12 @@ pub struct TokenResponse {
|
|||||||
pub token_type: TokenPurpose,
|
pub token_type: TokenPurpose,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, serde::Deserialize, serde::Serialize)]
|
||||||
|
pub struct TwoFactorAuthStatusResponse {
|
||||||
|
pub totp: bool,
|
||||||
|
pub recovery_code: bool,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, serde::Serialize)]
|
#[derive(Debug, serde::Serialize)]
|
||||||
#[serde(untagged)]
|
#[serde(untagged)]
|
||||||
pub enum TokenOrPayloadResponse<T> {
|
pub enum TokenOrPayloadResponse<T> {
|
||||||
|
|||||||
@ -1874,3 +1874,16 @@ pub async fn terminate_two_factor_auth(
|
|||||||
token,
|
token,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn check_two_factor_auth_status(
|
||||||
|
state: AppState,
|
||||||
|
user_token: auth::UserFromToken,
|
||||||
|
) -> UserResponse<user_api::TwoFactorAuthStatusResponse> {
|
||||||
|
Ok(ApplicationResponse::Json(
|
||||||
|
user_api::TwoFactorAuthStatusResponse {
|
||||||
|
totp: tfa_utils::check_totp_in_redis(&state, &user_token.user_id).await?,
|
||||||
|
recovery_code: tfa_utils::check_recovery_code_in_redis(&state, &user_token.user_id)
|
||||||
|
.await?,
|
||||||
|
},
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|||||||
@ -1214,6 +1214,7 @@ impl User {
|
|||||||
// Two factor auth routes
|
// Two factor auth routes
|
||||||
route = route.service(
|
route = route.service(
|
||||||
web::scope("/2fa")
|
web::scope("/2fa")
|
||||||
|
.service(web::resource("").route(web::get().to(check_two_factor_auth_status)))
|
||||||
.service(
|
.service(
|
||||||
web::scope("/totp")
|
web::scope("/totp")
|
||||||
.service(web::resource("/begin").route(web::get().to(totp_begin)))
|
.service(web::resource("/begin").route(web::get().to(totp_begin)))
|
||||||
|
|||||||
@ -218,7 +218,8 @@ impl From<Flow> for ApiIdentifier {
|
|||||||
| Flow::TotpUpdate
|
| Flow::TotpUpdate
|
||||||
| Flow::RecoveryCodeVerify
|
| Flow::RecoveryCodeVerify
|
||||||
| Flow::RecoveryCodesGenerate
|
| Flow::RecoveryCodesGenerate
|
||||||
| Flow::TerminateTwoFactorAuth => Self::User,
|
| Flow::TerminateTwoFactorAuth
|
||||||
|
| Flow::TwoFactorAuthStatus => Self::User,
|
||||||
|
|
||||||
Flow::ListRoles
|
Flow::ListRoles
|
||||||
| Flow::GetRole
|
| Flow::GetRole
|
||||||
|
|||||||
@ -735,3 +735,20 @@ pub async fn terminate_two_factor_auth(
|
|||||||
))
|
))
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn check_two_factor_auth_status(
|
||||||
|
state: web::Data<AppState>,
|
||||||
|
req: HttpRequest,
|
||||||
|
) -> HttpResponse {
|
||||||
|
let flow = Flow::TwoFactorAuthStatus;
|
||||||
|
Box::pin(api::server_wrap(
|
||||||
|
flow,
|
||||||
|
state.clone(),
|
||||||
|
&req,
|
||||||
|
(),
|
||||||
|
|state, user, _, _| user_core::check_two_factor_auth_status(state, user),
|
||||||
|
&auth::DashboardNoPermissionAuth,
|
||||||
|
api_locking::LockAction::NotApplicable,
|
||||||
|
))
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
|||||||
@ -414,6 +414,8 @@ pub enum Flow {
|
|||||||
RecoveryCodesGenerate,
|
RecoveryCodesGenerate,
|
||||||
// Terminate two factor authentication
|
// Terminate two factor authentication
|
||||||
TerminateTwoFactorAuth,
|
TerminateTwoFactorAuth,
|
||||||
|
// Check 2FA status
|
||||||
|
TwoFactorAuthStatus,
|
||||||
/// List initial webhook delivery attempts
|
/// List initial webhook delivery attempts
|
||||||
WebhookEventInitialDeliveryAttemptList,
|
WebhookEventInitialDeliveryAttemptList,
|
||||||
/// List delivery attempts for a webhook event
|
/// List delivery attempts for a webhook event
|
||||||
|
|||||||
Reference in New Issue
Block a user