90 lines
3.1 KiB
Python
90 lines
3.1 KiB
Python
import datetime
|
|
from datetime import timedelta
|
|
from flask import request, jsonify
|
|
from marshmallow import ValidationError
|
|
from app.utils.logger import logger
|
|
from app.api.helpers.response_helper import ResponseHelper
|
|
from app.api.schemas.generate_token import GenerateTokenRequestSchema, GenerateTokenResponseSchema
|
|
from app.config import Config
|
|
from flask_jwt_extended import (
|
|
create_access_token,
|
|
)
|
|
|
|
|
|
class GenerateTokenService:
|
|
USERNAME = Config.BANK_CALL_BASIC_AUTH_USERNAME
|
|
PASSWORD = Config.BANK_CALL_BASIC_AUTH_PASSWORD
|
|
TYPE = Config.BANK_GRANT_TYPE
|
|
@staticmethod
|
|
def process_request(data):
|
|
"""
|
|
Process the GenerateToken request.
|
|
|
|
Args:
|
|
data (dict): The request JSON payload.
|
|
|
|
Returns:
|
|
tuple: (JSON response, status code)
|
|
"""
|
|
try:
|
|
logger.info("Processing GenerateToken request")
|
|
|
|
# Step 1: Validate input using schema
|
|
schema = GenerateTokenRequestSchema()
|
|
validated_data = schema.load(data)
|
|
|
|
logger.info(f"Validated data: {validated_data}")
|
|
|
|
username = validated_data.get("username")
|
|
password = validated_data.get("password")
|
|
grant_type = validated_data.get("grant_type")
|
|
|
|
if password != GenerateTokenService.PASSWORD or username != GenerateTokenService.USERNAME or grant_type != GenerateTokenService.TYPE:
|
|
return {
|
|
"message": "Invalid credentials",
|
|
"status": 401
|
|
}
|
|
|
|
expires_in = 1800
|
|
identity = username
|
|
# Step 2: Generate JWT token
|
|
access_token = create_access_token(identity=identity, expires_delta=timedelta(seconds=expires_in))
|
|
|
|
# Step 3: Get client IP address
|
|
ipaddress = request.remote_addr or "127.0.0.1"
|
|
|
|
# Step 4: Build response timestamps
|
|
issued_time = datetime.datetime.utcnow()
|
|
expires_time = issued_time + datetime.timedelta(seconds=expires_in)
|
|
|
|
# Step 5: Construct response payload
|
|
response_data = {
|
|
"access_token": access_token,
|
|
"token_type": "bearer",
|
|
"expires_in": expires_in,
|
|
"userName": username,
|
|
"ipaddress": ipaddress,
|
|
"errorMessage": "",
|
|
"issued": issued_time,
|
|
"expires": expires_time
|
|
}
|
|
|
|
# Serialize with response schema
|
|
response_schema = GenerateTokenResponseSchema()
|
|
response_json = response_schema.dump(response_data)
|
|
|
|
return jsonify(response_json), 200
|
|
|
|
except ValidationError as err:
|
|
logger.error(f"Validation Error: {err.messages}")
|
|
return jsonify({
|
|
"message": "Validation exception",
|
|
"errors": err.messages
|
|
}), 422
|
|
|
|
except Exception as e:
|
|
logger.error(f"An error occurred while generating token: {str(e)}", exc_info=True)
|
|
return jsonify({
|
|
"message": "Internal Server Error"
|
|
}), 500
|