es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Excepción en Site.createExternalUser en Apex RESTclass: Site.ExternalUserCreateException: [Esa operación solo está permitida desde dentro de un sitio activo].

Tengo un sistema de autenticación que no es de Salesforce que contiene nombres de usuario y contraseñas para algunos miles de usuarios. Estoy dispuesto a migrar estos usuarios a Salesforce y darles acceso a mi sitio Experience Cloud. Estoy desarrollando un recurso REST Apex que tomará el nombre de usuario y la contraseña como argumentos y creará un usuario con ese nombre de usuario y contraseña con un perfil de comunidad. Planeo llamar a esta API desde mi sistema que no es de Salesforce y migrar todos estos usuarios. Estoy usando el método Site.createExternalUser en esta API. Estoy recibiendo la excepción Site.ExternalUserCreateException: [Esa operación solo está permitida dentro de un sitio activo.]. La razón por la que uso Site.createExternalUser es porque no quiero enviar el correo de bienvenida/cambio de contraseña a mis usuarios ya que se inscribieron con éxito hace mucho tiempo. Estoy abierto a cualquier otra alternativa para lograr esto.
A continuación se muestra mi código:

@RestResource(urlMapping='/createUser/*')
global with sharing class createUserRestResource {
    @HttpPost
    global static String doPost(){
        Contact con=new Contact();
        con.Firstname="First";
        con.LastName= "Last";
        con.Email="first.last@example.com";
        con.AccountId='/Agregar aquí un Id de cuenta./';
        insert con;

        User usr = new User();
        usr.Username= "usernameFromRequest@example.com";
        usr.Alias= "alias123";
        usr.Email= "first.last@example.com";
        usr.FirstName= "First";
        usr.IsActive= true;
        usr.LastName= "Last";
        usr.ProfileId='/Id de perfil de usuario de comunidad./';
        usr.EmailEncodingKey= 'ISO-8859-1';
        usr.TimeZoneSidKey= 'America/Los_Angeles';
        usr.LocaleSidKey= 'en_US';
        usr.LanguageLocaleKey= 'en_US';
        usr.ContactId = con.Id;

        String userId = Site.createExternalUser(usr, con.AccountId, 'Password@1234', false);
        return userId;
    }
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución:

    La razón detrás de la excepción Site.ExternalUserCreateException: [Esa operación solo se permite desde dentro de un sitio activo.] es que el método Site.createExternalUser solo puede ser llamado desde dentro de un sitio activo o desde el contexto del sitio Experience Cloud. Como la API se está llamando desde un sistema no Salesforce, este método no se puede utilizar para crear usuarios.

    Para lograr el objetivo de migrar usuarios del sistema de autenticación no Salesforce a Salesforce y proporcionar acceso al sitio Experience Cloud, puedes seguir el siguiente enfoque:

    1. Usa la API REST de Salesforce para crear usuarios en Salesforce desde el sistema de autenticación no Salesforce. Puedes utilizar cualquiera de las API REST de Salesforce como SOAP API, Bulk API o REST API para crear usuarios en Salesforce. Utiliza el nombre de usuario y la contraseña del usuario del sistema de autenticación no Salesforce para crear el usuario de Salesforce.
    2. Después de crear el usuario en Salesforce, asigna un perfil de comunidad al usuario. Puedes hacer esto utilizando las API REST de Salesforce o utilizando código Apex.

    3. Una vez que se haya creado el usuario y se le haya asignado un perfil de comunidad, podrá acceder al sitio Experience Cloud utilizando sus credenciales de Salesforce.

    4. Para evitar enviar el correo electrónico de bienvenida/cambio de contraseña a los usuarios, puedes actualizar la configuración del sitio Experience Cloud para que no envíe correos electrónicos de bienvenida/cambio de contraseña a los usuarios recién creados. Esto se puede hacer desde la configuración del sitio.

    A continuación se muestra un código de muestra sobre cómo crear un usuario utilizando la API REST:

    HttpRequest req = new HttpRequest();
    req.setEndpoint('https://yourInstance.salesforce.com/services/data/v52.0/sobjects/User');
    req.setMethod('POST');
    String username = 'testuser@example.com'; // Nombre de usuario del sistema de autenticación no Salesforce
    String password = 'password1234'; // Contraseña del sistema de autenticación no Salesforce
    String name = 'Test User'; // Nombre del usuario
    String alias = username.substringBefore('@'); // Generar un alias a partir del nombre de usuario
    String email = username;
    String lastName = 'User';
    String communityProfileId = '/Community User Profile Id/';
    JSONGenerator gen = JSON.createGenerator(true);
    gen.writeStartObject();
    gen.writeStringField('Username', username);
    gen.writeStringField('Alias', alias);
    gen.writeStringField('Email', email);
    gen.writeStringField('LastName', lastName);
    gen.writeStringField('CommunityNickname', alias);
    gen.writeStringField('ProfileId', communityProfileId);
    gen.writeBooleanField('IsActive', true);
    gen.writeEndObject();
    req.setBody(gen.getAsString());
    req.setHeader('Authorization', 'Bearer ' + UserInfo.getSessionId());
    Http http = new Http();
    HTTPResponse res = http.send(req);
    System.debug(res.getBody());
    

    Nota: Reemplaza ‘tuInstancia’ con la URL de tu instancia de Salesforce y ‘/Community User Profile Id/’ con el Id de perfil de usuario de la comunidad.

    Utilizando este enfoque, puedes migrar todos los usuarios del sistema de autenticación no Salesforce a Salesforce y proporcionarles acceso al sitio Salesforce Experience Cloud.

Comments are closed.