public with sharing class MicrosoftAuth extends BaseStorageAuth { // private static string key = '24425128-333b-4d65-ab59-da527a18e02b'; // private static string secert = 'c_H8Q~ZKOFl3htHnqRRUWooXjewlpmu5w9ZiNakk'; // private static string redirect_uri = 'https://login.salesforce.com/apex/HIC_FilesME__CompleteAuthPage'; // private static string authUrl='https://login.microsoftonline.com/00239250-7448-4ce2-9985-06db30238ef6/oauth2/v2.0/authorize'; // private static string oneDriveScope='offline_access%20user.read%20files.readwrite.all'; // private static string msTeamScope='offline_access%20user.read%20files.readwrite.all%20sites.readwrite.all%20team.readbasic.all%20teamtemplates.read%20team.create'; // private static string sharePointScope='offline_access%20user.read%20files.readwrite.all%20sites.readwrite.all'; // private static string tokenUrl='https://login.microsoftonline.com/00239250-7448-4ce2-9985-06db30238ef6/oauth2/token'; static String PROVIDER_TYPE = 'OneDrive'; // @AuraEnabled // public static String createAuthURL(String externalStorage) { // String appScope = ''; // if(externalStorage == 'Sharepoint'){ // appScope = sharePointScope; // }else if(externalStorage == 'OneDrive'){ // appScope = oneDriveScope; // }else if(externalStorage == 'MsTeam'){ // appScope = msTeamScope; // } // String key = EncodingUtil.urlEncode(key,'UTF-8'); // String uri = EncodingUtil.urlEncode(redirect_uri,'UTF-8'); // String authuri = ''; // authuri = authUrl+'?'+ // 'client_id='+key+ // '&response_type=code'+ // '&scope='+appScope+ // '&redirect_uri='+uri+ // '&access_type=offline'; // System.debug('url>>'+authuri); // return authuri; // } // constructor to initialize provider type for Microsoft (OneDrive, Sharepoint, MsTeam) public MicrosoftAuth() { // PROVIDER_TYPE = providerType; } public override void getAccessToken(String code ,String storage,boolean isAdminCred,String userId){ try { System.debug('>>>>>code='+code); System.debug('>>>>>storage='+storage); System.debug('>>>>>isAdminCred='+isAdminCred); System.debug('>>>>>userId='+userId); // boolean isProduction=OrgSandBoxOrProduction(); StorageProviderConfigUtil.Config config = StorageProviderConfigUtil.getConfig(PROVIDER_TYPE); String redirectUri = config.redirectUri; boolean isProduction = OAuthTokenManager.orgSandBoxOrProduction(); if(!isProduction){ redirectUri = redirectUri.replace('login.salesforce.com', 'test.salesforce.com'); } HttpRequest req = new HttpRequest(); req.setMethod('POST'); req.setEndpoint(config.tokenEndpoint); req.setHeader('content-type', 'application/x-www-form-urlencoded'); String body = 'code=' + EncodingUtil.urlEncode(code, 'UTF-8') + '&client_id=' + EncodingUtil.urlEncode(config.clientId, 'UTF-8') + '&client_secret=' + EncodingUtil.urlEncode(config.clientSecret, 'UTF-8') + '&redirect_uri=' + EncodingUtil.urlEncode(redirectUri, 'UTF-8') + '&grant_type=authorization_code'; req.setHeader('Content-length', String.valueOf(body.length())); req.setBody(body); req.setTimeout(60*1000); Http http = new Http(); String responseText; HttpResponse response = http.send(req); responseText = response.getBody(); if(response.getStatusCode() == 200){ responseText = response.getBody(); Map responseMap =(Map)JSON.deserializeUntyped(responseText) ; System.debug('responseMap>>>:'+JSON.serializePretty(responseMap)); String token = String.valueOf(responseMap.get('access_token')); String refreshToken=String.valueOf(responseMap.get('refresh_token')); System.debug('refreshToken>>>:'+JSON.serializePretty(refreshToken)); System.debug('>>>>storage'+storage); String connectedUsername = fetchUserInfo(token); Map tokenMapToUpsertInSalesforce = New Map () ; tokenMapToUpsertInSalesforce.put('HIC_FilesME__Auth_Provider_Name__c','Microsoft'); tokenMapToUpsertInSalesforce.put('HIC_FilesME__Connected_Username__c',connectedUsername); tokenMapToUpsertInSalesforce.put('HIC_FilesME__External_Storage_Type__c',storage); tokenMapToUpsertInSalesforce.put('HIC_FilesME__Refresh_Token__c',String.valueOf(responseMap.get('refresh_token'))); tokenMapToUpsertInSalesforce.put('HIC_FilesME__Access_Token__c',String.valueOf(responseMap.get('access_token'))); tokenMapToUpsertInSalesforce.put('HIC_FilesME__User__c',userId); tokenMapToUpsertInSalesforce.put('HIC_FilesME__Is_Admin_level_Credentials__c',isAdminCred); tokenMapToUpsertInSalesforce.put('HIC_FilesME__API_Endpoint_URL__c',config.tokenEndpoint); OAuthTokenManager.storeToken(tokenMapToUpsertInSalesforce); } } catch (Exception e) { FME_Logger.error('Error getting access token ' + e.getMessage(),'MicrosoftAuth','getAccessToken'); } } // CAN NOT SAVE ACCESS TOKEN OR REFRESH TOKEN (TOO LARGE TO FIT IN 5 TEXT TYPE FIELDS) public override String refreshAccessToken(String refreshToken){ try { StorageProviderConfigUtil.Config config = StorageProviderConfigUtil.getConfig(PROVIDER_TYPE); String body = 'client_id=' + EncodingUtil.urlEncode(config.clientId, 'UTF-8') + '&client_secret=' + EncodingUtil.urlEncode(config.clientSecret, 'UTF-8') + '&refresh_token=' + EncodingUtil.urlEncode(refreshToken, 'UTF-8') + '&grant_type=refresh_token' + '&scope=openid profile email'; Http http = new Http(); HttpRequest req = new HttpRequest(); // req.setEndpoint('https://login.microsoftonline.com/00239250-7448-4ce2-9985-06db30238ef6/oauth2/v2.0/token'); req.setEndpoint(config.tokenEndpoint); req.setMethod('POST'); req.setHeader('Content-Type', 'application/x-www-form-urlencoded'); req.setBody(body); HttpResponse res = http.send(req); if (res.getStatusCode() == 200) { Map responseMap = (Map) JSON.deserializeUntyped(res.getBody()); System.debug('responseMap>>>:' + JSON.serializePretty(responseMap)); String token = String.valueOf(responseMap.get('access_token')); System.debug('token>>>:' + JSON.serializePretty(token)); return token; } else { System.debug('Failed to refresh token. Response: ' + res.getBody()); return null; } } catch (Exception e) { System.debug('Exception while refreshing access token: ' + e.getMessage()); FME_Logger.error('Error refreshing access token: ' + e.getMessage(),'MicrosoftAuth','refreshAccessToken'); return null; } } private static String fetchUserInfo(String accessToken){ try { String graphApiEndpoint = 'https://graph.microsoft.com/v1.0/me'; HttpRequest req = new HttpRequest(); req.setEndpoint(graphApiEndpoint); req.setMethod('GET'); req.setHeader('Authorization', 'Bearer ' + accessToken); Http http = new Http(); HttpResponse res = http.send(req); if(res.getStatusCode() == 200){ Map userInfo = (Map) JSON.deserializeUntyped(res.getBody()); String name = (String) userInfo.get('displayName'); String email = (String) userInfo.get('mail'); return String.isNotBlank(name) ? name : email; } else { System.debug('Failed to fetch Microsoft user info: ' + res.getBody()); return null; } } catch (Exception e){ FME_Logger.error('Error fetching user info: ' + e.getMessage(),'MicrosoftAuth','fetchUserInfo'); return null; } } @AuraEnabled public static void revokeAccessToken(String accessToken){ try { } catch (Exception e) { throw new AuraHandledException(e.getMessage()); } } }