feat: implement authentication handling in HTTP requests

This commit is contained in:
Udhay-Adithya
2025-06-07 23:33:52 +05:30
parent 417706523b
commit 51fe211ef6
3 changed files with 98 additions and 13 deletions

View File

@@ -318,6 +318,8 @@ class CollectionStateNotifier
var responseRec = await sendHttpRequest(
requestId,
apiType,
requestModel.authData,
requestModel.authType,
substitutedHttpRequestModel,
defaultUriScheme: defaultUriScheme,
noSSL: noSSL,

View File

@@ -0,0 +1,76 @@
import 'dart:convert';
import 'package:apidash_core/consts.dart';
import 'package:apidash_core/models/api_auth_model.dart';
import 'package:apidash_core/models/http_request_model.dart';
import 'package:seed/seed.dart';
HttpRequestModel handleAuth(HttpRequestModel httpRequestModel,
APIAuthType apiAuthType, APIAuthModel? authData) {
if (authData == null || apiAuthType == APIAuthType.none) {
return httpRequestModel;
}
List<NameValueModel> updatedHeaders = List.from(httpRequestModel.headers ?? []);
List<NameValueModel> updatedParams = List.from(httpRequestModel.params ?? []);
List<bool> updatedHeaderEnabledList = List.from(httpRequestModel.isHeaderEnabledList ?? []);
List<bool> updatedParamEnabledList = List.from(httpRequestModel.isParamEnabledList ?? []);
switch (apiAuthType) {
case APIAuthType.basic:
final auth = authData as BasicAuth;
final encoded =
base64Encode(utf8.encode('${auth.username}:${auth.password}'));
updatedHeaders.add(const NameValueModel(name: 'Authorization', value: ''));
updatedHeaders[updatedHeaders.length - 1] = NameValueModel(
name: 'Authorization',
value: 'Basic $encoded'
);
updatedHeaderEnabledList.add(true);
break;
case APIAuthType.bearerToken:
final auth = authData as BearerTokenAuth;
updatedHeaders.add(NameValueModel(
name: 'Authorization',
value: 'Bearer ${auth.token}'
));
updatedHeaderEnabledList.add(true);
break;
case APIAuthType.jwtBearer:
final auth = authData as JWTBearerAuth;
updatedHeaders.add(NameValueModel(
name: 'Authorization',
value: 'Bearer ${auth.jwt}'
));
updatedHeaderEnabledList.add(true);
break;
case APIAuthType.apiKey:
final auth = authData as APIKeyAuth;
if (auth.location == 'header') {
updatedHeaders.add(NameValueModel(
name: auth.name,
value: auth.key
));
updatedHeaderEnabledList.add(true);
} else if (auth.location == 'query') {
updatedParams.add(NameValueModel(
name: auth.name,
value: auth.key
));
updatedParamEnabledList.add(true);
}
break;
default:
break;
}
return httpRequestModel.copyWith(
headers: updatedHeaders,
params: updatedParams,
isHeaderEnabledList: updatedHeaderEnabledList,
isParamEnabledList: updatedParamEnabledList,
);
}

View File

@@ -7,6 +7,7 @@ import '../consts.dart';
import '../extensions/extensions.dart';
import '../models/models.dart';
import '../utils/utils.dart';
import '../utils/handle_auth.dart';
import 'http_client_manager.dart';
typedef HttpResponse = http.Response;
@@ -16,6 +17,8 @@ final httpClientManager = HttpClientManager();
Future<(HttpResponse?, Duration?, String?)> sendHttpRequest(
String requestId,
APIType apiType,
APIAuthModel? authData,
APIAuthType apiAuthType,
HttpRequestModel requestModel, {
SupportedUriSchemes defaultUriScheme = kDefaultUriScheme,
bool noSSL = false,
@@ -25,15 +28,19 @@ Future<(HttpResponse?, Duration?, String?)> sendHttpRequest(
}
final client = httpClientManager.createClient(requestId, noSSL: noSSL);
// Handle authentication
final authenticatedRequestModel =
handleAuth(requestModel, apiAuthType, authData);
(Uri?, String?) uriRec = getValidRequestUri(
requestModel.url,
requestModel.enabledParams,
authenticatedRequestModel.url,
authenticatedRequestModel.enabledParams,
defaultUriScheme: defaultUriScheme,
);
if (uriRec.$1 != null) {
Uri requestUrl = uriRec.$1!;
Map<String, String> headers = requestModel.enabledHeadersMap;
Map<String, String> headers = authenticatedRequestModel.enabledHeadersMap;
bool overrideContentType = false;
HttpResponse? response;
String? body;
@@ -43,26 +50,26 @@ Future<(HttpResponse?, Duration?, String?)> sendHttpRequest(
var isMultiPartRequest =
requestModel.bodyContentType == ContentType.formdata;
if (kMethodsWithBody.contains(requestModel.method)) {
var requestBody = requestModel.body;
if (kMethodsWithBody.contains(authenticatedRequestModel.method)) {
var requestBody = authenticatedRequestModel.body;
if (requestBody != null &&
!isMultiPartRequest &&
requestBody.isNotEmpty) {
body = requestBody;
if (requestModel.hasContentTypeHeader) {
if (authenticatedRequestModel.hasContentTypeHeader) {
overrideContentType = true;
} else {
headers[HttpHeaders.contentTypeHeader] =
requestModel.bodyContentType.header;
authenticatedRequestModel.bodyContentType.header;
}
}
if (isMultiPartRequest) {
var multiPartRequest = http.MultipartRequest(
requestModel.method.name.toUpperCase(),
authenticatedRequestModel.method.name.toUpperCase(),
requestUrl,
);
multiPartRequest.headers.addAll(headers);
for (var formData in requestModel.formDataList) {
for (var formData in authenticatedRequestModel.formDataList) {
if (formData.type == FormDataType.text) {
multiPartRequest.fields.addAll({formData.name: formData.value});
} else {
@@ -84,7 +91,7 @@ Future<(HttpResponse?, Duration?, String?)> sendHttpRequest(
return (convertedMultiPartResponse, stopwatch.elapsed, null);
}
}
switch (requestModel.method) {
switch (authenticatedRequestModel.method) {
case HTTPVerb.get:
response = await client.get(requestUrl, headers: headers);
break;
@@ -98,7 +105,7 @@ Future<(HttpResponse?, Duration?, String?)> sendHttpRequest(
case HTTPVerb.options:
final request = prepareHttpRequest(
url: requestUrl,
method: requestModel.method.name.toUpperCase(),
method: authenticatedRequestModel.method.name.toUpperCase(),
headers: headers,
body: body,
overrideContentType: overrideContentType,
@@ -109,13 +116,13 @@ Future<(HttpResponse?, Duration?, String?)> sendHttpRequest(
}
}
if (apiType == APIType.graphql) {
var requestBody = getGraphQLBody(requestModel);
var requestBody = getGraphQLBody(authenticatedRequestModel);
if (requestBody != null) {
var contentLength = utf8.encode(requestBody).length;
if (contentLength > 0) {
body = requestBody;
headers[HttpHeaders.contentLengthHeader] = contentLength.toString();
if (!requestModel.hasContentTypeHeader) {
if (!authenticatedRequestModel.hasContentTypeHeader) {
headers[HttpHeaders.contentTypeHeader] = ContentType.json.header;
}
}