Created
May 28, 2021 04:26
-
-
Save surajp/ebe7d849e28c13b956eb702f0d60f5d5 to your computer and use it in GitHub Desktop.
Create Named Credentials in Salesforce via Apex
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public with sharing class CreateNamedCredsController { | |
public static final String CLIENT_ID = '<clientid>'; | |
public static final String CLIENT_SECRET = '<clientsecret>'; | |
public static final String API_VERSION='v51.0'; | |
public static final String TOKEN_ENDPOINT_URL = 'https://login.salesforce.com/services/oauth2/token'; | |
public static final String AUTHORIZE_ENDPOINT_URL = 'https://login.salesforce.com/services/oauth2/authorize'; | |
public static final String REDIRECT_URL = URL.getSalesforceBaseUrl().toExternalForm()+'/apex/AuthHandler'; | |
public static final String NAMEDCRED_TOOLING_ENDPOINT_URL = URL.getSalesforceBaseUrl().toExternalForm()+'/services/data/'+API_VERSION+'/tooling/sobjects/NamedCredential/'; | |
public static final String AUTH_PROVIDER_NAME = 'SF_Auth'; | |
public String namedCredName { get; set; } | |
public String getAuthUrl() { | |
return AUTHORIZE_ENDPOINT_URL+'?response_type=code&client_id='+CLIENT_ID+'&redirect_uri='+REDIRECT_URI+'&scope=api refresh_token&prompt=select_account&state=' + | |
this.namedCredName; | |
} | |
public Pagereference checkAndAct() { | |
if (String.isBlank(this.namedCredName) && String.isBlank(Apexpages.currentPage().getParameters().get('state'))) { | |
return null; | |
} | |
if (Apexpages.currentPage().getParameters().containsKey('code')) { | |
return this.getTokenAndCreateNamedCred(); | |
} | |
return new Pagereference(this.getAuthUrl()); | |
} | |
public Pagereference getTokenAndCreateNamedCred() { | |
String code = Apexpages.currentPage().getParameters().get('code'); | |
this.namedCredName = Apexpages.currentPage().getParameters().get('state'); | |
HttpRequest req = new HttpRequest(); | |
req.setEndpoint(TOKEN_ENDPOINT_URL); | |
req.setMethod('POST'); | |
req.setHeader('Content-Type', 'application/x-www-form-urlencoded'); | |
String reqBody = ''; | |
reqBody += 'client_id=' + CLIENT_ID + '&'; | |
reqBody += 'client_secret=' + CLIENT_SECRET + '&'; | |
reqBody += 'grant_type=authorization_code&'; | |
reqBody += 'code=' + code + '&'; | |
reqBody += 'redirect_uri=' + REDIRECT_URL + '&'; | |
reqBody += 'format=json'; | |
req.setBody(reqBody); | |
req.setHeader('Content-Length', String.valueOf(reqBody.length())); | |
HttpResponse resp = new Http().send(req); | |
TokenResponse tok = (TokenResponse) JSON.deserialize(resp.getBody(), TokenResponse.class); | |
this.createNamedCred(tok); | |
Pagereference ref = Page.AuthHandler; | |
ref.setRedirect(true); | |
return ref; | |
} | |
private void createNamedCred(TokenResponse resp) { | |
HttpRequest req = new HttpRequest(); | |
req.setEndpoint(NAMEDCRED_TOOLING_ENDPOINT_URL); | |
req.setMethod('POST'); | |
req.setHeader('Authorization', 'Bearer ' + UserInfo.getSessionId()); | |
req.setHeader('Content-Type', 'application/json'); | |
req.setHeader('Content-Type', 'application/json'); | |
NamedCredMetadata namedCredMdt = new NamedCredMetadata(); | |
namedCredMdt.authTokenEndpointUrl = TOKEN_ENDPOINT_URL; | |
namedCredMdt.label = this.namedCredName; | |
namedCredMdt.oauthToken = resp.access_token; | |
namedCredMdt.oauthRefreshToken = resp.refresh_token; | |
namedCredMdt.endpoint = resp.instance_url + '/services/data/'+API_VERSION; | |
namedCredMdt.authProvider = AUTH_PROVIDER_NAME; | |
NamedCred namedCred = new NamedCred(); | |
namedCred.FullName = this.namedCredName.replace(' ', '_'); | |
namedCred.Metadata = namedCredMdt; | |
req.setBody(JSON.serialize(namedCred)); | |
HttpResponse namedCredResp = new Http().send(req); | |
System.debug('>>Response ' + namedCredResp.getbody()); | |
} | |
class NamedCred { | |
public NamedCredMetadata Metadata; | |
public String FullName; | |
} | |
class NamedCredMetadata { | |
public String authTokenEndpointUrl; | |
public String authProvider; | |
public String endpoint; | |
public String label; | |
public String oauthToken; | |
public String oauthRefreshToken; | |
public String principalType = 'NamedUser'; | |
public String protocol = 'Oauth'; | |
} | |
class TokenResponse { | |
public String refresh_token; | |
public String instance_url; | |
public String access_token; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment