Skip to content

Instantly share code, notes, and snippets.

@surajp
Created May 28, 2021 04:26
Show Gist options
  • Save surajp/ebe7d849e28c13b956eb702f0d60f5d5 to your computer and use it in GitHub Desktop.
Save surajp/ebe7d849e28c13b956eb702f0d60f5d5 to your computer and use it in GitHub Desktop.
Create Named Credentials in Salesforce via Apex
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