mirror of
				https://github.com/juspay/hyperswitch.git
				synced 2025-11-04 05:59:48 +08:00 
			
		
		
		
	customers: Added ephemeral key authentication for customer retrieve (#89)
This commit is contained in:
		@ -12,6 +12,7 @@ use super::{
 | 
			
		||||
};
 | 
			
		||||
use crate::{
 | 
			
		||||
    configs::settings::Server,
 | 
			
		||||
    consts,
 | 
			
		||||
    core::{
 | 
			
		||||
        errors::{self, CustomResult, RouterResult, StorageErrorExt},
 | 
			
		||||
        payment_methods::cards,
 | 
			
		||||
@ -21,7 +22,7 @@ use crate::{
 | 
			
		||||
    services,
 | 
			
		||||
    types::{
 | 
			
		||||
        api::{self, enums as api_enums},
 | 
			
		||||
        storage::{self, enums as storage_enums},
 | 
			
		||||
        storage::{self, enums as storage_enums, ephemeral_key},
 | 
			
		||||
    },
 | 
			
		||||
    utils::{
 | 
			
		||||
        self,
 | 
			
		||||
@ -571,7 +572,7 @@ pub async fn create_customer_if_not_exist<'a, F: Clone, R>(
 | 
			
		||||
pub async fn make_pm_data<'a, F: Clone, R>(
 | 
			
		||||
    operation: BoxedOperation<'a, F, R>,
 | 
			
		||||
    state: &'a AppState,
 | 
			
		||||
    payment_method: Option<storage_enums::PaymentMethodType>,
 | 
			
		||||
    payment_method_type: Option<storage_enums::PaymentMethodType>,
 | 
			
		||||
    txn_id: &str,
 | 
			
		||||
    _payment_attempt: &storage::PaymentAttempt,
 | 
			
		||||
    request: &Option<api::PaymentMethod>,
 | 
			
		||||
@ -579,7 +580,7 @@ pub async fn make_pm_data<'a, F: Clone, R>(
 | 
			
		||||
) -> RouterResult<(BoxedOperation<'a, F, R>, Option<api::PaymentMethod>)> {
 | 
			
		||||
    let payment_method = match (request, token) {
 | 
			
		||||
        (_, Some(token)) => Ok::<_, error_stack::Report<errors::ApiErrorResponse>>(
 | 
			
		||||
            if payment_method == Some(storage_enums::PaymentMethodType::Card) {
 | 
			
		||||
            if payment_method_type == Some(storage_enums::PaymentMethodType::Card) {
 | 
			
		||||
                // TODO: Handle token expiry
 | 
			
		||||
                Vault::get_payment_method_data_from_locker(state, token).await?
 | 
			
		||||
            } else {
 | 
			
		||||
@ -598,7 +599,13 @@ pub async fn make_pm_data<'a, F: Clone, R>(
 | 
			
		||||
 | 
			
		||||
    let payment_method = match payment_method {
 | 
			
		||||
        Some(pm) => Some(pm),
 | 
			
		||||
        None => Vault::get_payment_method_data_from_locker(state, txn_id).await?,
 | 
			
		||||
        None => {
 | 
			
		||||
            if payment_method_type == Some(storage_enums::PaymentMethodType::Card) {
 | 
			
		||||
                Vault::get_payment_method_data_from_locker(state, txn_id).await?
 | 
			
		||||
            } else {
 | 
			
		||||
                None
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    Ok((operation, payment_method))
 | 
			
		||||
@ -897,6 +904,40 @@ pub fn make_merchant_url_with_response(
 | 
			
		||||
    Ok(merchant_url_with_response.to_string())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub async fn make_ephemeral_key(
 | 
			
		||||
    state: &AppState,
 | 
			
		||||
    customer_id: String,
 | 
			
		||||
    merchant_id: String,
 | 
			
		||||
) -> errors::RouterResponse<ephemeral_key::EphemeralKey> {
 | 
			
		||||
    let store = &state.store;
 | 
			
		||||
    let id = utils::generate_id(consts::ID_LENGTH, "eki");
 | 
			
		||||
    let secret = format!("epk_{}", &Uuid::new_v4().simple().to_string());
 | 
			
		||||
    let ek = ephemeral_key::EphemeralKeyNew {
 | 
			
		||||
        id,
 | 
			
		||||
        customer_id,
 | 
			
		||||
        merchant_id,
 | 
			
		||||
        secret,
 | 
			
		||||
    };
 | 
			
		||||
    let ek = store
 | 
			
		||||
        .create_ephemeral_key(ek, state.conf.eph_key.validity)
 | 
			
		||||
        .await
 | 
			
		||||
        .change_context(errors::ApiErrorResponse::InternalServerError)
 | 
			
		||||
        .attach_printable("Unable to create ephemeral key")?;
 | 
			
		||||
    Ok(services::BachResponse::Json(ek))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub async fn delete_ephemeral_key(
 | 
			
		||||
    store: &dyn StorageInterface,
 | 
			
		||||
    ek_id: String,
 | 
			
		||||
) -> errors::RouterResponse<ephemeral_key::EphemeralKey> {
 | 
			
		||||
    let ek = store
 | 
			
		||||
        .delete_ephemeral_key(&ek_id)
 | 
			
		||||
        .await
 | 
			
		||||
        .change_context(errors::ApiErrorResponse::InternalServerError)
 | 
			
		||||
        .attach_printable("Unable to delete ephemeral key")?;
 | 
			
		||||
    Ok(services::BachResponse::Json(ek))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn make_pg_redirect_response(
 | 
			
		||||
    payment_id: String,
 | 
			
		||||
    response: &api::PaymentsResponse,
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user