Solución:
Cambio:
request.setEndpoint('https://ap5.salesforce.com/services/oauth2/token');
a cualquiera Acceso o prueba dependiendo de si está en producción o sandbox
request.setEndpoint('https://[login | test].salesforce.com/services/oauth2/token');
También debe colocar los parámetros en el cuerpo o como parámetros de URL y no como encabezado
request.setBody(
'grant_type=password' +
'&client_id=xxxx' +
'&client_secret=xx' +
'&username=xx' +
'&password=xx'
);
Ahora entendí el concepto y gracias por compartir otros enlaces.
client_id, client_secret, username, password and grant_type
debe enviarse en un HTTP POST
cuerpo no en el encabezado.
HttpRequest req = new HttpRequest();
req.setMethod('POST');
req.setHeader('Content-Type','application/x-www-form-urlencoded');
req.setEndpoint('https://ap5.salesforce.com/services/oauth2/token');
String CLIENT_ID = 'XXXXXXXXXXXXXXXXXXXXXXXXX';
String CLIENT_SECRET = 'XXXXXXXXXXXXXXXXXXXXXXX';
String USERNAME = 'XXXXXXXXXXXXXX';
String PASSWORD = 'XXXXXXXXXXXXXX';
req.setBody('grant_type=password' + '&client_id='+CLIENT_ID +
'&client_secret="+CLIENT_SECRET + "&username="+USERNAME + "&password='+PASSWORD);
Http http = new Http();
HTTPResponse response = http.send(req);
System.debug('Body ' + response.getBody());
System.debug('Status ' + response.getStatus());
System.debug('Status code ' + response.getStatusCode());
Aquí está el resultado:
Tuvo el mismo error (SalesForce 2020). Debajo Administrar aplicaciones conectadas, Tenía que asegurarme de que los ámbitos de OAuth seleccionados fueran los siguientes
- Acceda y administre sus datos (api)
- Proporcionar acceso a sus datos a través de la Web (web)
- Permita el acceso a su identificador único (openid)
Para el servidor, tuve que asegurarme de estar usando mi propio dominio que puede seguir bajo
Setup / My Domain / Your Domain Name
NodeJS
const jsforce = require('jsforce');
const conn = new jsforce.Connection({
loginUrl: 'https://......salesforce.com',
});
const username=".....";
const password = 'user_password' + 'user_security_token';
conn.login(username, password, function (err, userInfo) {
if (err) { return console.error(err); } else {
console.log('connected');
}
});
Tenga en cuenta esa contraseña es una concatenación de la contraseña del usuario y el token de seguridad del usuario.