diff --git a/lib/providers/collection_providers.dart b/lib/providers/collection_providers.dart index e46820a6..0fc8d387 100644 --- a/lib/providers/collection_providers.dart +++ b/lib/providers/collection_providers.dart @@ -318,6 +318,8 @@ class CollectionStateNotifier var responseRec = await sendHttpRequest( requestId, apiType, + requestModel.authData, + requestModel.authType, substitutedHttpRequestModel, defaultUriScheme: defaultUriScheme, noSSL: noSSL, diff --git a/packages/apidash_core/lib/utils/handle_auth.dart b/packages/apidash_core/lib/utils/handle_auth.dart new file mode 100644 index 00000000..f626269b --- /dev/null +++ b/packages/apidash_core/lib/utils/handle_auth.dart @@ -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 updatedHeaders = List.from(httpRequestModel.headers ?? []); + List updatedParams = List.from(httpRequestModel.params ?? []); + List updatedHeaderEnabledList = List.from(httpRequestModel.isHeaderEnabledList ?? []); + List 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, + ); +} diff --git a/packages/better_networking/lib/services/http_service.dart b/packages/better_networking/lib/services/http_service.dart index 31c7ef06..087521dd 100644 --- a/packages/better_networking/lib/services/http_service.dart +++ b/packages/better_networking/lib/services/http_service.dart @@ -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 headers = requestModel.enabledHeadersMap; + Map 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; } }