Issue:
Bug: [REFACTOR] update auth data for recon APIs



### Refactor Description

Refactor the code to
- pass only the required authentication data to recon APIs (remove UserFromToken which contains different resource IDs)
- remove existing impls for fetching user from DB

### Have you spent some time checking if this feature request has been raised before?

- [X] I checked and didn't find a similar issue

### Have you read the Contributing Guidelines?

- [X] I have read the [Contributing Guidelines](https://github.com/juspay/hyperswitch/blob/main/docs/CONTRIBUTING.md)

### Are you willing to submit a PR?

Yes, I am willing to submit a PR!

Pull request description:
## Type of Change
<!-- Put an `x` in the boxes that apply -->

- [ ] Bugfix
- [ ] New feature
- [ ] Enhancement
- [x] Refactoring
- [ ] Dependency updates
- [ ] Documentation
- [ ] CI/CD

## Description
Described in #5838 

### Additional Changes

- [ ] This PR modifies the API contract
- [ ] This PR modifies the database schema
- [ ] This PR modifies application configuration/environment variables

<!--
Provide links to the files with corresponding changes.

Following are the paths where you can find config files:
1. `config`
2. `crates/router/src/configs`
3. `loadtest/config`
-->


## Motivation and Context
Helps removing redundant code.


## How did you test it?
<details>
    <summary>1. Request a new JWT token for recon dashboard</summary>

cURL Request

    curl --location 'http://localhost:8080/recon/token' \
        --header 'Content-Type: application/json' \
        --header 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiOWZmNzcxNmItNzBlMi00MjdiLWE1NzctMzNkOTZiNWM5YzM4IiwibWVyY2hhbnRfaWQiOiJtZXJjaGFudF8xNzI1NTYwNTg4Iiwicm9sZV9pZCI6Im9yZ19hZG1pbiIsImV4cCI6MTcyNjA0MTcwNywib3JnX2lkIjoib3JnX2dMZjA1Ykc4bEVVMFE5T2NPeFNNIiwicHJvZmlsZV9pZCI6InByb19ER3FOSkhMYlRWSk9uejBIcDJYQyJ9.aepFkZLGZUYHGY0R0dSNsvevrZodDtfwfEDyriBiti0' \
        --data ''

Response

    {
        "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiOWZmNzcxNmItNzBlMi00MjdiLWE1NzctMzNkOTZiNWM5YzM4IiwibWVyY2hhbnRfaWQiOiJtZXJjaGFudF8xNzI1NTYwNTg4Iiwicm9sZV9pZCI6Im9yZ19hZG1pbiIsImV4cCI6MTcyNjA0MTczNywib3JnX2lkIjoib3JnX2dMZjA1Ykc4bEVVMFE5T2NPeFNNIiwicHJvZmlsZV9pZCI6InByb19ER3FOSkhMYlRWSk9uejBIcDJYQyJ9.U8agaqNLLk-NdCE5WdqYOFa5IUHXAW3TCa4Gb7IcYfs"
    }

</details>

<details>
    <summary>2. Verify this recon token</summary>

cURL Request

    curl --location 'http://localhost:8080/recon/verify_token' \
    --header 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiOWZmNzcxNmItNzBlMi00MjdiLWE1NzctMzNkOTZiNWM5YzM4IiwibWVyY2hhbnRfaWQiOiJtZXJjaGFudF8xNzI1NTYwNTg4Iiwicm9sZV9pZCI6Im9yZ19hZG1pbiIsImV4cCI6MTcyNjA0MTczNywib3JnX2lkIjoib3JnX2dMZjA1Ykc4bEVVMFE5T2NPeFNNIiwicHJvZmlsZV9pZCI6InByb19ER3FOSkhMYlRWSk9uejBIcDJYQyJ9.U8agaqNLLk-NdCE5WdqYOFa5IUHXAW3TCa4Gb7IcYfs' \
    --data ''

Response

    {
        "merchant_id": "merchant_1725560588",
        "user_email": "example@example.com"
    }

</details>

<details>
    <summary>3. Switch the merchant on dashboard from the same user and request a new JWT token for recon dashboard</summary>

cURL Request

    curl --location 'http://localhost:8080/recon/token' \
    --header 'Content-Type: application/json' \
    --header 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiOWZmNzcxNmItNzBlMi00MjdiLWE1NzctMzNkOTZiNWM5YzM4IiwibWVyY2hhbnRfaWQiOiJtZXJjaGFudF8xNzI1NTYwNzU0Iiwicm9sZV9pZCI6Im9yZ19hZG1pbiIsImV4cCI6MTcyNjA0MTgyNSwib3JnX2lkIjoib3JnX2dMZjA1Ykc4bEVVMFE5T2NPeFNNIiwicHJvZmlsZV9pZCI6InByb19kcWxvUTR4bzRVbG9Lb0swMVpoTiJ9.nZtXfvFWUC7FfAbNQ_IouE5zjWxYd8fahXhzR4bs_oQ' \
    --data ''

Response

    {
        "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiOWZmNzcxNmItNzBlMi00MjdiLWE1NzctMzNkOTZiNWM5YzM4IiwibWVyY2hhbnRfaWQiOiJtZXJjaGFudF8xNzI1NTYwNzU0Iiwicm9sZV9pZCI6Im9yZ19hZG1pbiIsImV4cCI6MTcyNjA0MTgzOCwib3JnX2lkIjoib3JnX2dMZjA1Ykc4bEVVMFE5T2NPeFNNIiwicHJvZmlsZV9pZCI6InByb19kcWxvUTR4bzRVbG9Lb0swMVpoTiJ9.kcgt6zaH5o8qVBvSWLopTMaUQEI5SwltGAnlWB7OSXk"
    }

</details>

<details>
    <summary>4. Verify this token (it should have switched merchant's ID)</summary>

cURL Request

    curl --location 'http://localhost:8080/recon/verify_token' \
    --header 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiOWZmNzcxNmItNzBlMi00MjdiLWE1NzctMzNkOTZiNWM5YzM4IiwibWVyY2hhbnRfaWQiOiJtZXJjaGFudF8xNzI1NTYwNzU0Iiwicm9sZV9pZCI6Im9yZ19hZG1pbiIsImV4cCI6MTcyNjA0MTgzOCwib3JnX2lkIjoib3JnX2dMZjA1Ykc4bEVVMFE5T2NPeFNNIiwicHJvZmlsZV9pZCI6InByb19kcWxvUTR4bzRVbG9Lb0swMVpoTiJ9.kcgt6zaH5o8qVBvSWLopTMaUQEI5SwltGAnlWB7OSXk' \
    --data ''

Response

    {
        "merchant_id": "merchant_1725560754",
        "user_email": "example@example.com"
    }

</details>


## Checklist
<!-- Put an `x` in the boxes that apply -->

- [x] I formatted the code `cargo +nightly fmt --all`
- [x] I addressed lints thrown by `cargo clippy`
- [x] I reviewed the submitted code
- [ ] I added unit tests for my changes where possible


Testing:
<details>
    <summary>1. Request a new JWT token for recon dashboard</summary>

cURL Request

    curl --location 'http://localhost:8080/recon/token' \
        --header 'Content-Type: application/json' \
        --header 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiOWZmNzcxNmItNzBlMi00MjdiLWE1NzctMzNkOTZiNWM5YzM4IiwibWVyY2hhbnRfaWQiOiJtZXJjaGFudF8xNzI1NTYwNTg4Iiwicm9sZV9pZCI6Im9yZ19hZG1pbiIsImV4cCI6MTcyNjA0MTcwNywib3JnX2lkIjoib3JnX2dMZjA1Ykc4bEVVMFE5T2NPeFNNIiwicHJvZmlsZV9pZCI6InByb19ER3FOSkhMYlRWSk9uejBIcDJYQyJ9.aepFkZLGZUYHGY0R0dSNsvevrZodDtfwfEDyriBiti0' \
        --data ''

Response

    {
        "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiOWZmNzcxNmItNzBlMi00MjdiLWE1NzctMzNkOTZiNWM5YzM4IiwibWVyY2hhbnRfaWQiOiJtZXJjaGFudF8xNzI1NTYwNTg4Iiwicm9sZV9pZCI6Im9yZ19hZG1pbiIsImV4cCI6MTcyNjA0MTczNywib3JnX2lkIjoib3JnX2dMZjA1Ykc4bEVVMFE5T2NPeFNNIiwicHJvZmlsZV9pZCI6InByb19ER3FOSkhMYlRWSk9uejBIcDJYQyJ9.U8agaqNLLk-NdCE5WdqYOFa5IUHXAW3TCa4Gb7IcYfs"
    }

</details>

<details>
    <summary>2. Verify this recon token</summary>

cURL Request

    curl --location 'http://localhost:8080/recon/verify_token' \
    --header 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiOWZmNzcxNmItNzBlMi00MjdiLWE1NzctMzNkOTZiNWM5YzM4IiwibWVyY2hhbnRfaWQiOiJtZXJjaGFudF8xNzI1NTYwNTg4Iiwicm9sZV9pZCI6Im9yZ19hZG1pbiIsImV4cCI6MTcyNjA0MTczNywib3JnX2lkIjoib3JnX2dMZjA1Ykc4bEVVMFE5T2NPeFNNIiwicHJvZmlsZV9pZCI6InByb19ER3FOSkhMYlRWSk9uejBIcDJYQyJ9.U8agaqNLLk-NdCE5WdqYOFa5IUHXAW3TCa4Gb7IcYfs' \
    --data ''

Response

    {
        "merchant_id": "merchant_1725560588",
        "user_email": "example@example.com"
    }

</details>

<details>
    <summary>3. Switch the merchant on dashboard from the same user and request a new JWT token for recon dashboard</summary>

cURL Request

    curl --location 'http://localhost:8080/recon/token' \
    --header 'Content-Type: application/json' \
    --header 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiOWZmNzcxNmItNzBlMi00MjdiLWE1NzctMzNkOTZiNWM5YzM4IiwibWVyY2hhbnRfaWQiOiJtZXJjaGFudF8xNzI1NTYwNzU0Iiwicm9sZV9pZCI6Im9yZ19hZG1pbiIsImV4cCI6MTcyNjA0MTgyNSwib3JnX2lkIjoib3JnX2dMZjA1Ykc4bEVVMFE5T2NPeFNNIiwicHJvZmlsZV9pZCI6InByb19kcWxvUTR4bzRVbG9Lb0swMVpoTiJ9.nZtXfvFWUC7FfAbNQ_IouE5zjWxYd8fahXhzR4bs_oQ' \
    --data ''

Response

    {
        "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiOWZmNzcxNmItNzBlMi00MjdiLWE1NzctMzNkOTZiNWM5YzM4IiwibWVyY2hhbnRfaWQiOiJtZXJjaGFudF8xNzI1NTYwNzU0Iiwicm9sZV9pZCI6Im9yZ19hZG1pbiIsImV4cCI6MTcyNjA0MTgzOCwib3JnX2lkIjoib3JnX2dMZjA1Ykc4bEVVMFE5T2NPeFNNIiwicHJvZmlsZV9pZCI6InByb19kcWxvUTR4bzRVbG9Lb0swMVpoTiJ9.kcgt6zaH5o8qVBvSWLopTMaUQEI5SwltGAnlWB7OSXk"
    }

</details>

<details>
    <summary>4. Verify this token (it should have switched merchant's ID)</summary>

cURL Request

    curl --location 'http://localhost:8080/recon/verify_token' \
    --header 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiOWZmNzcxNmItNzBlMi00MjdiLWE1NzctMzNkOTZiNWM5YzM4IiwibWVyY2hhbnRfaWQiOiJtZXJjaGFudF8xNzI1NTYwNzU0Iiwicm9sZV9pZCI6Im9yZ19hZG1pbiIsImV4cCI6MTcyNjA0MTgzOCwib3JnX2lkIjoib3JnX2dMZjA1Ykc4bEVVMFE5T2NPeFNNIiwicHJvZmlsZV9pZCI6InByb19kcWxvUTR4bzRVbG9Lb0swMVpoTiJ9.kcgt6zaH5o8qVBvSWLopTMaUQEI5SwltGAnlWB7OSXk' \
    --data ''

Response

    {
        "merchant_id": "merchant_1725560754",
        "user_email": "example@example.com"
    }

</details>

Patch:
diff --git a/crates/router/src/core/recon.rs b/crates/router/src/core/recon.rs
index fa9944ee8ee..2c2dfc9c9f0 100644
--- a/crates/router/src/core/recon.rs
+++ b/crates/router/src/core/recon.rs
@@ -17,11 +17,10 @@ use crate::{
 
 pub async fn send_recon_request(
     state: SessionState,
-    user_with_auth_data: authentication::UserFromTokenWithAuthData,
+    auth_data: authentication::AuthenticationDataWithUser,
 ) -> RouterResponse<recon_api::ReconStatusResponse> {
-    let user = user_with_auth_data.0;
-    let user_in_db = &user_with_auth_data.1.user;
-    let merchant_id = user.merchant_id;
+    let user_in_db = &auth_data.user;
+    let merchant_id = auth_data.merchant_account.get_id().clone();
 
     let user_email = user_in_db.email.clone();
     let email_contents = email_types::ProFeatureRequest {
@@ -55,7 +54,6 @@ pub async fn send_recon_request(
         .change_context(errors::ApiErrorResponse::InternalServerError)
         .attach_printable("Failed to compose and send email for ProFeatureRequest [Recon]")
         .async_and_then(|_| async {
-            let auth = user_with_auth_data.1;
             let updated_merchant_account = storage::MerchantAccountUpdate::ReconUpdate {
                 recon_status: enums::ReconStatus::Requested,
             };
@@ -65,9 +63,9 @@ pub async fn send_recon_request(
             let response = db
                 .update_merchant(
                     key_manager_state,
-                    auth.merchant_account,
+                    auth_data.merchant_account,
                     updated_merchant_account,
-                    &auth.key_store,
+                    &auth_data.key_store,
                 )
                 .await
                 .change_context(errors::ApiErrorResponse::InternalServerError)
diff --git a/crates/router/src/core/user.rs b/crates/router/src/core/user.rs
index 31ab0e8ff22..09d7ef8458c 100644
--- a/crates/router/src/core/user.rs
+++ b/crates/router/src/core/user.rs
@@ -1823,11 +1823,9 @@ pub async fn verify_token(
     state: SessionState,
     user: auth::UserFromToken,
 ) -> UserResponse<user_api::VerifyTokenResponse> {
-    let user_in_db = state
-        .global_store
-        .find_user_by_id(&user.user_id)
+    let user_in_db = user
+        .get_user_from_db(&state)
         .await
-        .change_context(UserErrors::InternalServerError)
         .attach_printable_lazy(|| {
             format!(
                 "Failed to fetch the user from DB for user_id - {}",
@@ -1837,7 +1835,7 @@ pub async fn verify_token(
 
     Ok(ApplicationResponse::Json(user_api::VerifyTokenResponse {
         merchant_id: user.merchant_id.to_owned(),
-        user_email: user_in_db.email,
+        user_email: user_in_db.0.email,
     }))
 }
 
diff --git a/crates/router/src/routes/user.rs b/crates/router/src/routes/user.rs
index 34097b6bac6..e112d543960 100644
--- a/crates/router/src/routes/user.rs
+++ b/crates/router/src/routes/user.rs
@@ -575,7 +575,10 @@ pub async fn verify_recon_token(state: web::Data<AppState>, http_req: HttpReques
         &http_req,
         (),
         |state, user, _req, _| user_core::verify_token(state, user),
-        &auth::DashboardNoPermissionAuth,
+        &auth::JWTAuth {
+            permission: Permission::ReconAdmin,
+            minimum_entity_level: EntityType::Merchant,
+        },
         api_locking::LockAction::NotApplicable,
     ))
     .await
diff --git a/crates/router/src/services/authentication.rs b/crates/router/src/services/authentication.rs
index 5f9fc798d89..d8318ce9517 100644
--- a/crates/router/src/services/authentication.rs
+++ b/crates/router/src/services/authentication.rs
@@ -1984,13 +1984,9 @@ where
     default_auth
 }
 
-#[derive(Clone)]
-#[cfg(feature = "recon")]
-pub struct UserFromTokenWithAuthData(pub UserFromToken, pub AuthenticationDataWithUser);
-
 #[cfg(feature = "recon")]
 #[async_trait]
-impl<A> AuthenticateAndFetch<UserFromTokenWithAuthData, A> for JWTAuth
+impl<A> AuthenticateAndFetch<AuthenticationDataWithUser, A> for JWTAuth
 where
     A: SessionStateInfo + Sync,
 {
@@ -1998,7 +1994,7 @@ where
         &self,
         request_headers: &HeaderMap,
         state: &A,
-    ) -> RouterResult<(UserFromTokenWithAuthData, AuthenticationType)> {
+    ) -> RouterResult<(AuthenticationDataWithUser, AuthenticationType)> {
         let payload = parse_jwt_payload::<A, AuthToken>(request_headers, state).await?;
         if payload.check_in_blacklist(state).await? {
             return Err(errors::ApiErrorResponse::InvalidJwtToken.into());
@@ -2049,17 +2045,9 @@ where
 
         let auth_type = AuthenticationType::MerchantJwt {
             merchant_id: auth.merchant_account.get_id().clone(),
-            user_id: Some(user_id.clone()),
-        };
-
-        let user = UserFromToken {
-            user_id,
-            merchant_id: payload.merchant_id.clone(),
-            org_id: payload.org_id,
-            role_id: payload.role_id,
-            profile_id: payload.profile_id,
+            user_id: Some(user_id),
         };
 
-        Ok((UserFromTokenWithAuthData(user, auth), auth_type))
+        Ok((auth, auth_type))
     }
 }