I've generated a bare bones Apex class to use WebServiceCallout.invoke to update the NamedCredential.
//Generated by FuseIT WSDL2Apex (http://www.fuseit.com/Solutions/SFDC-Explorer/Help-WSDL-Parser.aspx)
//Warning: '<xsd:anyType>' element anyType has been converted to string in CustomMetadataValue
//Warning: '<xsd:anyType>' element anyType has been converted to string in FieldValue
//Warning: '<xsd:any>' element type has been changed to dataType List<DOM.XmlNode> called anyElement
//Methods Included: updateMetadata
//Methods Excluded: cancelDeploy, checkDeployStatus, checkRetrieveStatus, createMetadata, deleteMetadata, deploy, deployRecentValidation, describeMetadata, describeValueType, listMetadata, readMetadata, renameMetadata, retrieve, upsertMetadata
// Primary Port Class Name: MetadataPort
public class MetadataService {
public class AllOrNoneHeader_element {
public Boolean allOrNone;
private String[] allOrNone_type_info = new String[]{'allOrNone','http://soap.sforce.com/2006/04/metadata','boolean','1','1','false'};
private String[] apex_schema_type_info = new String[]{'http://soap.sforce.com/2006/04/metadata','true','false'};
private String[] field_order_type_info = new String[]{'allOrNone'};
}
public class CallOptions_element {
public String client;
private String[] client_type_info = new String[]{'client','http://soap.sforce.com/2006/04/metadata','string','1','1','false'};
private String[] apex_schema_type_info = new String[]{'http://soap.sforce.com/2006/04/metadata','true','false'};
private String[] field_order_type_info = new String[]{'client'};
}
public class Error {
public MetadataService.ExtendedErrorDetails[] extendedErrorDetails;
public String[] fields;
public String message;
public String statusCode;
private String[] extendedErrorDetails_type_info = new String[]{'extendedErrorDetails','http://soap.sforce.com/2006/04/metadata','ExtendedErrorDetails','0','-1','false'};
private String[] fields_type_info = new String[]{'fields','http://soap.sforce.com/2006/04/metadata','string','0','-1','false'};
private String[] message_type_info = new String[]{'message','http://soap.sforce.com/2006/04/metadata','string','1','1','false'};
private String[] statusCode_type_info = new String[]{'statusCode','http://soap.sforce.com/2006/04/metadata','StatusCode','1','1','false'};
private String[] apex_schema_type_info = new String[]{'http://soap.sforce.com/2006/04/metadata','true','false'};
private String[] field_order_type_info = new String[]{'extendedErrorDetails','fields','message','statusCode'};
}
//Warning: '<xsd:any>' element type has been changed to dataType List<DOM.XmlNode> called anyElement
public class ExtendedErrorDetails {
public String extendedErrorCode;
public List<DOM.XmlNode> anyElement;
private String[] extendedErrorCode_type_info = new String[]{'extendedErrorCode','http://soap.sforce.com/2006/04/metadata','ExtendedErrorCode','1','1','false'};
private String[] anyElement_type_info = new String[]{'anyElement','http://soap.sforce.com/2006/04/metadata','List<DOM.XmlNode>','0','1','true'};
private String[] apex_schema_type_info = new String[]{'http://soap.sforce.com/2006/04/metadata','true','false'};
private String[] field_order_type_info = new String[]{'extendedErrorCode','anyElement'};
}
public virtual class Metadata {
public String fullName;
private String[] fullName_type_info = new String[]{'fullName','http://soap.sforce.com/2006/04/metadata','string','0','1','false'};
private String[] apex_schema_type_info = new String[]{'http://soap.sforce.com/2006/04/metadata','true','false'};
private String[] field_order_type_info = new String[]{'fullName'};
}
public class MetadataPort {
public String endpoint_x = 'https://login.salesforce.com/services/Soap/m/39.0';
public Map<String,String> inputHttpHeaders_x;
public Map<String,String> outputHttpHeaders_x;
public String clientCertName_x;
public String clientCert_x;
public String clientCertPasswd_x;
public Integer timeout_x;
public MetadataService.SessionHeader_element SessionHeader;
private String SessionHeader_hns = 'SessionHeader=http://soap.sforce.com/2006/04/metadata';
public MetadataService.CallOptions_element CallOptions;
private String CallOptions_hns = 'CallOptions=http://soap.sforce.com/2006/04/metadata';
public MetadataService.AllOrNoneHeader_element AllOrNoneHeader;
private String AllOrNoneHeader_hns = 'AllOrNoneHeader=http://soap.sforce.com/2006/04/metadata';
private String[] ns_map_type_info = new String[]{'http://soap.sforce.com/2006/04/metadata','MetadataService'};
public MetadataService.SaveResult[] updateMetadata(MetadataService.Metadata[] metadata) {
MetadataService.updateMetadata_element request_x = new MetadataService.updateMetadata_element();
MetadataService.updateMetadataResponse_element response_x;
request_x.metadata = metadata;
Map<String, MetadataService.updateMetadataResponse_element> response_map_x = new Map<String, MetadataService.updateMetadataResponse_element>();
response_map_x.put('response_x', response_x);
WebServiceCallout.invoke(
this,
request_x,
response_map_x,
new String[]{endpoint_x,
'',
'http://soap.sforce.com/2006/04/metadata',
'updateMetadata',
'http://soap.sforce.com/2006/04/metadata',
'updateMetadataResponse',
'MetadataService.updateMetadataResponse_element'}
);
response_x = response_map_x.get('response_x');
return response_x.result;
}
}
public class SaveResult {
public MetadataService.Error[] errors;
public String fullName;
public Boolean success;
private String[] errors_type_info = new String[]{'errors','http://soap.sforce.com/2006/04/metadata','Error','0','-1','false'};
private String[] fullName_type_info = new String[]{'fullName','http://soap.sforce.com/2006/04/metadata','string','1','1','false'};
private String[] success_type_info = new String[]{'success','http://soap.sforce.com/2006/04/metadata','boolean','1','1','false'};
private String[] apex_schema_type_info = new String[]{'http://soap.sforce.com/2006/04/metadata','true','false'};
private String[] field_order_type_info = new String[]{'errors','fullName','success'};
}
public class SessionHeader_element {
public String sessionId;
private String[] sessionId_type_info = new String[]{'sessionId','http://soap.sforce.com/2006/04/metadata','string','1','1','false'};
private String[] apex_schema_type_info = new String[]{'http://soap.sforce.com/2006/04/metadata','true','false'};
private String[] field_order_type_info = new String[]{'sessionId'};
}
public class updateMetadata_element {
public MetadataService.Metadata[] metadata;
private String[] metadata_type_info = new String[]{'metadata','http://soap.sforce.com/2006/04/metadata','Metadata','0','-1','false'};
private String[] apex_schema_type_info = new String[]{'http://soap.sforce.com/2006/04/metadata','true','false'};
private String[] field_order_type_info = new String[]{'metadata'};
}
public class updateMetadataResponse_element {
public MetadataService.SaveResult[] result;
private String[] result_type_info = new String[]{'result','http://soap.sforce.com/2006/04/metadata','SaveResult','0','-1','false'};
private String[] apex_schema_type_info = new String[]{'http://soap.sforce.com/2006/04/metadata','true','false'};
private String[] field_order_type_info = new String[]{'result'};
}
public class NamedCredential extends Metadata {
public String type = 'NamedCredential';
public String fullName;
private String[] fullName_type_info = new String[]{'fullName','http://soap.sforce.com/2006/04/metadata',null,'0','1','false'};
public String authProvider;
public String certificate;
public String endpoint;
public String label;
public String oauthRefreshToken;
public String oauthScope;
public String oauthToken;
public String password;
public String principalType;
public String protocol;
public String username;
private String[] authProvider_type_info = new String[]{'authProvider','http://soap.sforce.com/2006/04/metadata',null,'0','1','false'};
private String[] certificate_type_info = new String[]{'certificate','http://soap.sforce.com/2006/04/metadata',null,'0','1','false'};
private String[] endpoint_type_info = new String[]{'endpoint','http://soap.sforce.com/2006/04/metadata',null,'0','1','false'};
private String[] label_type_info = new String[]{'label','http://soap.sforce.com/2006/04/metadata',null,'1','1','false'};
private String[] oauthRefreshToken_type_info = new String[]{'oauthRefreshToken','http://soap.sforce.com/2006/04/metadata',null,'0','1','false'};
private String[] oauthScope_type_info = new String[]{'oauthScope','http://soap.sforce.com/2006/04/metadata',null,'0','1','false'};
private String[] oauthToken_type_info = new String[]{'oauthToken','http://soap.sforce.com/2006/04/metadata',null,'0','1','false'};
private String[] password_type_info = new String[]{'password','http://soap.sforce.com/2006/04/metadata',null,'0','1','false'};
private String[] principalType_type_info = new String[]{'principalType','http://soap.sforce.com/2006/04/metadata',null,'1','1','false'};
private String[] protocol_type_info = new String[]{'protocol','http://soap.sforce.com/2006/04/metadata',null,'1','1','false'};
private String[] username_type_info = new String[]{'username','http://soap.sforce.com/2006/04/metadata',null,'0','1','false'};
private String[] apex_schema_type_info = new String[]{'http://soap.sforce.com/2006/04/metadata','true','false'};
private String[] type_att_info = new String[]{'xsi:type'};
private String[] field_order_type_info = new String[]{'fullName', 'authProvider','certificate','endpoint','label','oauthRefreshToken','oauthScope','oauthToken','password','principalType','protocol','username'};
}
}
Usage is identical to the Metadata Service wrapper (as they are both generated from the WSDL) but is solely focused on updating NamedCredential records.
MetadataService.NamedCredential credential = new MetadataService.NamedCredential();
credential.fullName = 'Demo_Credential';
credential.label = 'Demo Credential';
credential.endpoint = 'https://www.demo.com';
credential.principalType = 'Anonymous';
credential.protocol = 'NoAuthentication';
credential.oauthToken = '<newTokenValue>';
MetadataService.MetadataPort service = new MetadataService.MetadataPort();
service.SessionHeader = new MetadataService.SessionHeader_element();
service.SessionHeader.sessionId = UserInfo.getSessionId();
service.endpoint_x = URL.getSalesforceBaseUrl().toExternalForm() + '/services/Soap/m/39.0';
service.updateMetadata(
new List<MetadataService.Metadata> { credential }
);
System.assertEquals(1, results.size());
MetadataService.SaveResult sr = results[0];
System.debug(sr);
System.assert(sr.success);
I also deployed the following package, which didn't report any errors and was confirmed to update the NamedCredential.MasterLabel
Zip Structure
- package.xml
- namedCredentials/Demo_Credential.namedCredential
package.xml
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>Demo_Credential</members>
<name>NamedCredential</name>
</types>
<version>39.0</version>
</Package>
Demo_Credential.namedCredential
<?xml version="1.0" encoding="UTF-8"?>
<NamedCredential xmlns="http://soap.sforce.com/2006/04/metadata">
<endpoint>https://www.demo.com</endpoint>
<label>Demo Credential</label>
<principalType>Anonymous</principalType>
<protocol>NoAuthentication</protocol>
<oauthToken>TestToken</oauthToken>
</NamedCredential>
named credentials
is supposed to mask from the admin/developer the acquisition/lifecycle of the oauth token, I am not surprised.