🌐 Conexión a NetSuite con OAuth 2.0: Guía Rápida 🚀
OAuth 2.0 es el estándar de la industria para la autorización. Permite que aplicaciones de terceros accedan a recursos de NetSuite en nombre de un usuario, sin exponer las credenciales del usuario.
📜 Flujo General de OAuth 2.0 (Authorization Code Grant)
- Tu Aplicación ➡️ Redirige al Usuario a NetSuite para autorización.
- Usuario 👤 Inicia sesión en NetSuite y autoriza tu aplicación.
- NetSuite ➡️ Redirige de vuelta a Tu Aplicación con un
código de autorización. - Tu Aplicación 🔄 Intercambia el
código de autorizacióncon NetSuite por untoken de acceso(y untoken de refresco). - Tu Aplicación 🔑 Usa el
token de accesopara realizar llamadas API a NetSuite.
🛠️ Paso 1: Configuración en NetSuite (Lado del Servidor)
Necesitarás permisos de administrador en NetSuite.
-
Habilitar Características:
- Ve a
Setup > Company > Enable Features. - En la pestaña
SuiteCloud, asegúrate de que las siguientes características estén habilitadas:SERVER SUITESCRIPT(si planeas usar SuiteScript)CLIENT SUITESCRIPT(si planeas usar SuiteScript)SUITETALK (WEB SERVICES)OAUTH 2.0
- Guarda los cambios.
- Ve a
-
Crear un Registro de Integración:
- Ve a
Setup > Integration > Manage Integrations > New. - Nombre: Dale un nombre descriptivo a tu integración (ej: “Mi App OAuth2”).
- Estado:
Enabled. - Nota (Opcional): Descripción de la integración.
- En la pestaña
Authentication:- Marca la casilla
OAUTH 2.0. - Grant Type: Selecciona
AUTHORIZATION CODE GRANT. - REDIRECT URI(s): Ingresa la(s) URL(s) a la(s) que NetSuite redirigirá al usuario después de la autorización. Esta debe ser una URL en tu aplicación que pueda manejar el código de autorización. (Ej:
https://miapp.com/oauth2/callback) - OAUTH 2.0 SCOPES: Selecciona los permisos necesarios para tu aplicación (ej:
REST WEB SERVICES,USER_PROFILE,TRANSACTIONS, etc.).
- Marca la casilla
- Guarda el registro de integración.
- Ve a
-
Obtener Credenciales:
- Una vez guardado, NetSuite mostrará el
CLIENT IDyCLIENT SECRET. - ¡IMPORTANTE! Copia y guarda de forma segura el
Client IDyClient Secret. ElClient Secretno se mostrará de nuevo.
- Una vez guardado, NetSuite mostrará el
⚙️ Paso 2: Flujo de Autorización (Lado de tu Aplicación Cliente)
Ahora, en tu aplicación, implementarás el flujo OAuth 2.0.
2.1. Solicitud de Autorización del Usuario
Redirige al usuario al endpoint de autorización de NetSuite. Construye la URL de la siguiente manera:
-
URL Base:
https://<ACCOUNT_ID>.app.netsuite.com/app/login/oauth2/authorize.nl- Reemplaza
<ACCOUNT_ID>con tu ID de cuenta de NetSuite (ej:1234567o1234567_SB1para sandbox). Puedes encontrarlo enSetup > Company > Company Information > ACCOUNT ID.
- Reemplaza
-
Parámetros (Query String):
response_type=codeclient_id=<TU_CLIENT_ID>(El Client ID obtenido en el Paso 1.3)redirect_uri=<TU_REDIRECT_URI>(La misma URI que configuraste en NetSuite)scope=<LISTA_DE_SCOPES_SEPARADOS_POR_ESPACIO>(Ej:rest_webservices user_profile)state=<VALOR_ALEATORIO_SEGURO>(Opcional pero recomendado para prevenir CSRF)
Ejemplo de URL de Autorización: https://1234567.app.netsuite.com/app/login/oauth2/authorize.nl?response_type=code&client_id=abcdef12345&redirect_uri=https%3A%2F%2Fmiapp.com%2Foauth2%2Fcallback&scope=rest_webservices%20transactions&state=xyz789
2.2. Usuario Autoriza la Aplicación
El usuario será llevado a la página de login de NetSuite. Después de iniciar sesión, se le presentará una pantalla para autorizar o denegar el acceso a tu aplicación con los scopes solicitados.
2.3. NetSuite Redirige con el Código de Autorización
Si el usuario autoriza, NetSuite lo redirigirá a tu redirect_uri con:
code=<CODIGO_DE_AUTORIZACION>state=<VALOR_STATE_ORIGINAL>(si lo enviaste)
Ejemplo de Redirección:
https://miapp.com/oauth2/callback?code=def456&state=xyz789
Tu aplicación debe capturar este code.
2.4. Intercambiar el Código por Tokens de Acceso y Refresco
Con el code obtenido, tu aplicación debe hacer una petición POST al endpoint de token de NetSuite para obtener el access_token y refresh_token.
-
URL del Token:
https://<ACCOUNT_ID>.suitetalk.api.netsuite.com/services/rest/auth/oauth2/v1/token- Reemplaza
<ACCOUNT_ID>con tu ID de cuenta.
- Reemplaza
-
Método:
POST -
Headers:
Content-Type: application/x-www-form-urlencodedAuthorization: Basic <BASE64_ENCODED_CLIENT_ID:CLIENT_SECRET>- Donde
<BASE64_ENCODED_CLIENT_ID:CLIENT_SECRET>es la cadenaCLIENT_ID:CLIENT_SECRETcodificada en Base64. (Ej:YWJjZGVmMTIzNDU6c2VjcmV0eHl6Nzg5)
- Donde
-
Cuerpo de la Petición (form-urlencoded):
grant_type=authorization_codecode=<CODIGO_DE_AUTORIZACION_RECIBIDO>redirect_uri=<TU_REDIRECT_URI>
Ejemplo de Petición (usando cURL):
curl -X POST \
'https://1234567.suitetalk.api.netsuite.com/services/rest/auth/oauth2/v1/token' \
-H 'Content-Type: application/x-www-form-urlencoded' \
-H 'Authorization: Basic YWJjZGVmMTIzNDU6c2VjcmV0eHl6Nzg5' \
-d 'grant_type=authorization_code&code=def456&redirect_uri=https%3A%2F%2Fmiapp.com%2Foauth2%2Fcallback'```
Respuesta Exitosa (JSON):
{
"access_token": "an_access_token_string",
"refresh_token": "a_refresh_token_string",
"expires_in": 3600, // Segundos hasta que el access_token expire (generalmente 1 hora)
"token_type": "Bearer"
}
¡IMPORTANTE! Almacena de forma segura el access_token y el refresh_token. El refresh_token se usa para obtener nuevos access_token cuando el actual expire, sin necesidad de que el usuario vuelva a autorizar.
🚀 Paso 3: Realizar Peticiones API a NetSuite
Usa el access_token obtenido para autorizar tus llamadas a la API REST de NetSuite.
- Header de Autorización: Authorization: Bearer <ACCESS_TOKEN>
- Header Adicional (para REST): Prefer: transient (opcional, pero puede ayudar con la concurrencia y el versionado)
Ejemplo de Petición API (usando cURL para obtener un registro de cliente):
curl -X GET \
'https://<ACCOUNT_ID>.suitetalk.api.netsuite.com/services/rest/record/v1/customer/123' \
-H 'Authorization: Bearer an_access_token_string' \
-H 'Prefer: transient'
Reemplaza <ACCOUNT_ID> y el ID del cliente (123).
🔄 Paso 4: Refrescar el Token de Acceso (Opcional pero Recomendado)
Cuando el access_token expire, usa el refresh_token para obtener uno nuevo.
-
URL del Token: https://<ACCOUNT_ID>.suitetalk.api.netsuite.com/services/rest/auth/oauth2/v1/token
-
Método: POST
-
Headers:
- Content-Type: application/x-www-form-urlencoded
- Authorization: Basic <BASE64_ENCODED_CLIENT_ID:CLIENT_SECRET>
-
Cuerpo de la Petición (form-urlencoded):
- grant_type=refresh_token
- refresh_token=<TU_REFRESH_TOKEN_GUARDADO>
Respuesta Exitosa (JSON):
{
"access_token": "a_new_access_token_string",
"expires_in": 3600,
"token_type": "Bearer"
// NetSuite puede o no devolver un nuevo refresh_token. Si lo hace, actualiza el que tienes guardado.
}
💡 Consideraciones Importantes
- Seguridad del Client Secret: Trata el Client Secret como una contraseña. No lo expongas en el código del lado del cliente (frontend).
- Almacenamiento de Tokens: Almacena los access_token y refresh_token de forma segura (ej: base de datos encriptada, gestor de secretos).
- Manejo de Errores: Implementa un manejo robusto de errores para todos los pasos del flujo OAuth y las llamadas API.
- Parámetro state: Úsalo para mitigar ataques CSRF. Genera un valor aleatorio antes de redirigir al usuario, guárdalo en la sesión del usuario, y verifica que el valor devuelto por NetSuite coincida.
- Vigencia de Tokens: Los access_token suelen tener una vida corta (1 hora). Los refresh_token suelen tener una vida más larga (ej: 7 días, o hasta ser revocados), pero esto puede variar. Consulta la documentación de NetSuite.
- Scopes: Solicita solo los scopes (permisos) que tu aplicación realmente necesita.