Flujo de tokens de activos de OAuth 2.0 para asegurar dispositivos conectados
Para integrar dispositivos IoT con la API de Salesforce, utilice el flujo de tokens de activos de OAuth 2.0. Los tokens de activos son un token de autenticación JWT basado en estándares abiertos para la verificación y protección de solicitudes desde dispositivos conectados. Los tokens de activos identifican el dispositivo en un servicio backend que procesa la transmisión de datos y eventos desde el dispositivo. Estos tokens permiten el registro de datos del dispositivo con la plataforma Salesforce y su vinculación del dispositivo con datos de Salesforce CRM acerca del cliente, cuenta o contacto.
Ediciones necesarias
| Disponible en: Salesforce Classic y Lightning Experience |
| Disponible en: todas las ediciones |
Consulte Las nuevas aplicaciones conectadas ya no se pueden crear en Spring ‘26 para obtener más detalles.
Los dispositivos (a través de aplicaciones conectadas) utilizan este flujo de token de activos de OAuth 2.0 para solicitar un token de activos desde Salesforce. En este flujo, un token de acceso de OAuth y un token de actor se intercambian para un token de activos. Este flujo combina la emisión del token de activos y el registro de activos, para un intercambio de token eficiente y una vinculación automática de dispositivos con datos de activos de Service Cloud.
Por ejemplo, su cliente adquiere un dispositivo conectado y registra una cuenta con su sitio de asistencia. Su compañía ofrece una aplicación móvil que actúa como un agente para el registro de dispositivos. Una aplicación conectada permite al usuario conectar con el dispositivo, iniciar sesión en su sitio de asistencia y registrar el dispositivo. A cambio de un token de acceso y un token de actor, su sitio emite un token de activos que identifica el dispositivo en su servicio backend de la nube.
Después del registro, el dispositivo puede operar independientemente de la aplicación conectada, enviando datos habitualmente acerca de su estado y operaciones a su servicio backend. Si el backend detecta un comportamiento o estado anormal por anticipado, crea automáticamente un caso. El caso está asociado con el activo, que está aparejado directamente al registro de contacto del cliente y el proceso de asistencia de su compañía. El dispositivo también puede indicar que un suministro de oficina, como el tóner de tinta, está bajo, identificando potencialmente una nueva oportunidad de mercado.
El flujo del token de activos de OAuth 2.0 incluye estos pasos generales.
- Configure una aplicación conectada para emitir tokens de activos para dispositivos conectados. Consulte Activar configuración de OAuth para integración de API.
- La aplicación conectada solicita un token de acceso desde el extremo de tokens de Salesforce.
- Después de que Salesforce otorgue un token de acceso, la aplicación conectada solicita un token de activos empleando el protocolo de intercambio de tokens de OAuth 2.0.
- Si el JWT del token de activos es válido, Salesforce emite su token de activos y registra el dispositivo.
- Salesforce publica un evento de token de activos.
Solicitar un token de acceso
Para que una aplicación conectada emita un token de activos para el dispositivo conectado, primero invoca un flujo de OAuth 2.0 para solicitar un token de acceso. Después de recibir el token de acceso, la aplicación conectada lo intercambia por un token de activos, que requiere para el registro del dispositivo.
Los métodos comunes para obtener tokens de acceso incluyen el flujo web-servidor de OAuth 2.0 y el flujo de soporte JWT de OAuth 2.0. Con un navegador y una utilidad como cURL, puede obtener e intercambiar un código de autorización de la manera siguiente.
- En un navegador, vaya a esta URL después de sustituir los valores de marcador. https://su_url_sitio/services/oauth2/authorize?response_type=code&client_id=su_id_cliente& redirect_uri=su_uri_redireccionamiento_codificado_url
- Inicie sesión y apruebe su aplicación.
- Cuando recibe una devolución de llamada, obtiene el código de autorización. Sustitúyalo junto con los otros valores de marcador a cambio de un token de acceso.
curl -s -k -d "grant_type=authorization_code&code=authorization_code&redirect_uri= your_url_encoded_redirect_uri&client_id=your_client_id&client_secret=your_client_secret" https://your_site_url/services/oauth2/token
Solicitar un AssetToken
Después de recibir un token de acceso, la aplicación publica una solicitud de token de activos de en el extremo de tokens de Salesforce, empleando el protocolo de intercambio de tokens de OAuth 2.0.
Esta es una solicitud de muestra publicada en el extremo de token de Salesforce utilizando un token de actor no firmado.
POST /services/oauth2/token HTTP/1.1
Host: customersite.my.site.com
Content-Type: application/x-www-form-urlencoded
grant_type=urn:ietf:params:oauth:grant-type:token-exchange&
subject_token_type=urn:ietf:params:oauth:token-type:access_token&
subject_token=0DB00001iSr!AR0AQDhXv4xNCYPUwRa3_KyiZxNgNmrJU7QPJUrvBRM9x
3MLnlEbOOsuldLL.3mb.nML1h8G8zAc2zkUU_q.HEM6bY0kOJjDL&
actor_token_type=urn:ietf:params:oauth:token-type:jwt&
actor_token=eyJhbGciOiJub25lIiwidHlwIjoiSldU In0.eyJkaWQiOiI4NTc4OTliOS02OTk4LTQzZD
QtODQ4My0xOTRlODBkNzE4Y2MiLCJBc3NldFRva2VuQ3VzdG9tQXR0cmlidXRlX19jIjoiTXkgVmFsdWUiLC
JBc3NldCI6eyJOYW1lIjoiRGlzaHdhc2hlciIsIlNlcmlhbE51bWJlciI6IjEyMzQ1Njc4In19.
La solicitud incluye estos parámetros:
| Parámetro | Descripción |
|---|---|
grant_type
|
Utilice estos valores para el tipo de otorgamiento: urn:ietf:params:oauth:grant-type:token-exchange. |
subject_token_type
|
Obligatorio. El valor debe ser urn:ietf:params:oauth:token-type:access_token. |
subject_token
|
Obligatorio. El token de asunto es un token de seguridad que representa la identidad del usuario para el que se está realizando la solicitud. Para tokens de activos, el valor es el token de acceso. |
actor_token_type
|
Opcional a menos que se especifique actor_token. El valor debe ser urn:ietf:params:oauth:token-type:jwt. |
actor_token
|
Opcional. El token de actor, que es un token de seguridad, representa la identidad del usuario autorizado a utilizar el token de seguridad solicitado y actuar en nombre del asunto. Para los tokens de activos, el valor es un JWT que contiene metadatos acerca de su activo nuevo o existente. Si su caso de uso requiere Prueba de posesión, puede incluir una clave de confirmación y firmar el token de actor. En caso contrario, puede estar sin firmar. |
La carga del token de actor es un JWT que incluye un conjunto de reclamaciones acerca del dispositivo que está registrando. Todas las reclamaciones son opcionales. Si no pasa ninguno de estos metadatos, Salesforce podrá emitir su token de activos pero no podemos registrar el dispositivo al mismo tiempo.
Este token de actor de ejemplo incluye una reclamación de activo.
{
"did": "2c4c73e7-edc5-77dd-011d-43562d21cb7e",
"Name": "My Asset Token",
"cnf": {
"jwk": {
"kty": "RSA",
"e": "AQAB",
"use": "sig",
"alg": "RS256",
"n": "AJNGcu8nW6xq2l_dAgbJmSfHLGRn-vCuKWY-LAELw-Kerjaj5Dq3ZGW38HR4BmZksG3g4eA1RXn1hiZGI1Q 6Ei59QE_OZQx2zVSTb7-oIwRcDHEB1-RraYT3LJuh4JwUDVfEj3WgDnTjE5vD46l_CR5EXf4VL8uo8T40FkA
51AhT"
}
},
"Asset": {
"Name": "Asset 19730",
"SerialNumber": "9461094121",
"AccountId": "001D000000KtKgS",
"MyCustomAssetField__c": "Depreciated"
}
}
Puede incluir estas reclamaciones en la carga de token de actor.
| Reclamación | Descripción |
|---|---|
did
|
El Id. del dispositivo. Si se incluye, se guarda y se devuelve en el token de activos emitido. |
Name
|
Nombre del token de activos. |
cnf
|
La confirmación contiene una clave RSA específica del dispositivo en formato Clave de JSON Web, que se define en la especificación Semántica clave de prueba de posesión para tokens JSON Web. Si se incluye, el token de actor se debe firmar con la clave privada correspondiente a la clave pública. |
Asset
|
Objeto JSON de activo que contiene cualquier campo válido desde el objeto activo, incluyendo campos personalizados. Si se incluye, se utiliza para vincular un activo existente por Id. o número de serie o para crear un activo con el nombre especificado. |
exp
|
Caducidad. Si se incluye, se utiliza para validar que el JWT no ha caducado. |
Después de crear su carga de token de actor, cree un JWT de token de actor. El formato depende de si el token de actor está firmado o no. Los tokens de actor no firmados transmiten reclamaciones para el registro del activo sin una clave pública del dispositivo correspondiente. Los tokens de actor firmados le permiten incluir una clave pública en el token de activos resultante. El dispositivo utiliza la clave pública para probar la posesión de la clave privada, garantizando que el token se utilice por el dispositivo para el cual se emitió.
Este es un token de actor no firmado de muestra:
eyJhbGciOiAibm9uZSJ9.eyAiZGlkIiA6ICIzNDk2NDMzMS04YTZjLTRmODYtYjM0Zi0zMjI3ZWExZjU1MDk iLCAiTmFtZSIgOiAiMzQ5NjQzMzEtOGE2Yy0Zjg2LWIzNGYtMzIyN2VhMWY1NTA5IiwgIkFzc2V0IiA6IHs
gIk5hbWUiIDogIk15IENvbm5lY3RlZCBEZXZpY2UiLCAiU2VyaWFsTnVtYmVyIiA6ICIzNDk2NDMzMS04YTZ jLTRmODYtYjM0Zi0zMjI3ZWExZjU1MDkiLCAiQWNjb3VudElkIiA6ICIwMDFEMDAwMDAwS3Uwd0UiIH0gfQ.Que se descodifica en un encabezado de:
{"alg": "none"}
Y una carga de:
{
"did": "34964331-8a6c-4f86-b34f-3227ea1f5509",
"Name": "My Asset Token",
"Asset" : {
"Name" : "My Connected Device",
"SerialNumber" : "349643 1-8a6c-4f86-b34f-3227ea1f5509",
"AccountId" : "001D000000Ku0wE"
}
}
No hay ningún bloque de firmas.
Un token de actor no firmado tiene un encabezado con una reclamación alg única. La reclamación de algoritmo indica que no se aplicó ninguna firma al JWT. El valor debe ser none.
El bloque de firmas es una firma RSA SHA256 de header.payload. codificada en base64url y anexa al JWT. Esta firma en el JWT debe ser verificable utilizando la clave pública proporcionada en la reclamación cnf. Si es válida, la clave pública se guarda en el registro de eventos del token de activos y se incluye en la reclamación cnf en el JWT del token de activos devuelto.
Este es un token de actor firmado de muestra:
eyJhbGciOiAibm9uZSJ9.eyAiZGlkIiA6ICIzNDk2NDMzMS04YTZjLTRmODYtYjM0Zi0zMjI3ZWExZjU1MDk iLCAiTmFtZSIgOiAiMzQ5NjQzMzEtOGE2Yy0Zjg2LWIzNGYtMzIyN2VhMWY1NTA5IiwgIkFzc2V0IiA6IHs gIk5hbWUiIDogIk15IENvbm5lY3RlZCBEZXZpY2UiLCAiU2VyaWFsTnVtYmVyIiA6ICIzNDk2NDMzMS04YTZ
jLTRmODYtYjM0Zi0zMjI3ZWExZjU1MDkiLCAiQWNjb3VudElkIiA6ICIwMDFEMDAwMDAwS3Uwd0UiIH0gfQ. DLVM9EGvZ1VasMSzPbi7mviIXucvTktfOTYq62cTVduSsLKR4gX3Q8xfm85SfqoMaCQVXLNGkZ1iYv5LjJ4_ e69yl9r5gIML7qHDwQOSqgsNYd8HPK4qpXv1QMzBCRXCNenqQ0YhJbokCPWeHWWnPNGFYuquKL2fTTmczadToEl token de actor se descodifica en este encabezado:
{
"typ": "JWT",
"alg": "RS256"
}
El token de actor también se descodifica en esta carga:
{
"cnf": {
"jwk": {
"kty": "RSA",
"e": "AQAB",
"use": "sig",
"alg": "RS256",
"n": "AJNGcu8nW6xq2l_dAgbJmSfHLGRn-vCuKWY-LAELw-Kerjaj5Dq3ZGW38HR4BmZksG3g4eA1RXn1hiZGI1Q 6Ei59QE_OZQx2zVSTb7-oIwRcDHEB1-RraYT3LJuh4JwUDVfEj3WgDnTjE5vD46l_CR5EXf4VL8uo8T40FkA
51AhT"
}
},
"did": "34964331-8a6c-4f86-b34f-3227ea1f5509",
"Name": "My Asset Token"
}
Un token de actor firmado tiene un encabezado con estas reclamaciones:
| Reclamación | Descripción |
|---|---|
alg
|
Reclamación de algoritmo para identificar el algoritmo de firma. El valor debe ser RS256. |
typ
|
La reclamación de tipo identifica el tipo de token. El valor debe ser JWT. |
Salesforce otorga un token de activos
Si el JWT del token de actor es válido, la respuesta del token de acceso de Salesforce contiene un mensaje de éxito y devuelve su token de activos. Por ejemplo:
HTTP/1.1 200 OK
Date: Wed, 06 Jan 2017 21:25:11 GMT
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Pragma: no-cache
Cache-Control: no-cache, no-store,s-maxage=0 Content-Type: application/json;charset=UTF-8
{
"access_token":"eyJraWQiOiJBc3NldHMiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOl siaHR0cDovL2xvY2FsaG9zdDo1MDAwIl0sIm5iZiI6MTQ1MjExNTUxMSwiaXNzIjoiaHR0cHM6Ly9hc3NldG lkLWRldmVsb3Blci1lZGl0aW9uLm5hMS1ibGl0ejAzLnNvbWEuZm9yY2UuY29tIiwiaWQiOiIwNWJEMDAwMD AwMDAwMUiLCJleHAiOjE0NTI2MzM5MTEsImFpZCI6IjAyaUQwMDAwMDAxNkdESyIsImRpZCI6IjM0OTY0Mz MxLThNmMtNGY4Ni1iMzRmLTMyMjdlYTFmNTUwOSJ9.poVKl-fBrFi9tgKurAM2vbyGWZ5asbXJ5nQlfA CsStFnksKiS14gD9_oK9RchHsLlAt3gSCkIXtdFMmHDPQECtfpvhXhCBw-FAYLNnhJVivU7oNimiUzEVhYlw
-p7V3Qr2lmPzhXzEisELWuQgkyfABdiI9PUOjJA3rLb6RSBmCSA5sjkYKlCjnxRcMA9ZExgS5134yq_bPR V9BTrDwy2O34Ml2VwGjl9kIMWa5v8CHEtP7eMHbJpqgHQXpwnPna0ND4kAr7EQGF1zuIUBJMS35ZyZYtw5Eg da1QbYm8TGpRaKP7tiB0GL1_i3MhGeEC8qnlXg6pWuhJd_Q",
"issued_token_type":"urn:ietf:params:oauth:token-type:jwt",
"token_type":"Bearer",
"expires_in":51840
}
access_token contiene su token de activos emitido. El parámetro expires_in representa la longitud de validez que especificó en su aplicación conectada.El JWT de token de activos devuelto en la respuesta de token de acceso contiene un encabezado, carga, y, si está firmado, una firma.
Este es un token de activo firmado de muestra:
eyJraWQiOiJBc3NldHMiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOlsiaHR0cDovL2x
vY2FsaG9zdDo1MDAwIl0sIm5iZiI6MTQ1MjUzNzUyMCwiaXNzIjoiaHR0cHM6Ly9hc3NldGlkLWRldmV
sb3Blci1lZGl0aW9uLm5hMS1ibGl0ejAzLnNvbWEuZm9yY2UuY29tIiwiY25mIjp7Imp3ayI6eyJrdHk
iOiJSU0EiLCJlIjoiQVFBQiIsImtpZCI6ImRldmljZWtleSIsIm4iOiJoUHBlM1RqYkJTMHB2dzFoMGQ
zbWxqdkNsOVp4Uk9YNzhRNEhLUGVPQjBPWml3QzBaSXBtaHdWZGRQeWFxYklVdTJvcUJORkc3S2Q4YVM
zMDJtQVlkLXNuQzdIcnlzekd1YzIwOFIyMUVMTGJwZ2dWOUlKdl9zdnRMNXh4UjlUdjBfUFRBNFUyR0h
VbnE1dFdDTlNqVEhoYkNzWHNrSmlLSWN4MHR3N2tJMmNaR01VQTJvakEyb1U1YkFrSDYyUkNBUTNEcDl
xTktoNldxZlI3VUpyQlV6NTFuaHVEcnE5eTFRWE1RX3pNZENXLTVTUEFMTE3ekRJa2oyX3FSdmR6LUJQ
SFRPYkU4WXg3cGFlenYzS0hZa3prRHd1M3hqUGhEZGtXMURXMWFraC1zdVpQcFl3STl4bDJ6RUNJMVU1
UVdmT0szeTIwTW1jSEFtRXhtQXIyRHcifX0sImlkIjoiMDViRDAwMDAwMDAwMDVCIiwiZXhwIjoxNDUz
MDU1OTE3LCJhaWQiOiIwMmlEMDAwMDAwMTZHTWciLCJkaWQiOiIyYzRjNzNlNy1lZGM1LTc3ZGQtMDEx
ZC00MzU2MmQyMWNiN2UifQ.Bi-CJGeOUPibvw73oZN26fNM4wEjX1XF657s9dzAgJZCXZlFps4Atu-4H
eILBnnkEkGJPLhSLm88nWcANPIFVNQKkAEifQtUjj2QE7AIWdzoFC9RuyxFv0HnAwRYkJuqoE5en3HV9
8qWMxh1-J3m0eFRTS1tUPSnrKnnPvHktuH4TdRpi3RTl3bueXmgUdYeIXNcpG71wRZDheEGxK_p5Uejq
1YmZVz1a6TBAZG3bH5sJhO0ygk1eHlHwzc5Q0yEH7cI_T5wv7puu_TTiGpDFiWwOcnvsBA8Kf8-LWEaP
Ku6Aypgbg3Ii3kY6RQEQaeTYpd8Q_jSlJi7IwQIA5WbLAEl token de activos se descodifica en este encabezado:
{
"kid": "00D300000000mlxEAA.978",
"typ": "JWT",
"alg": "RS256"
}
El token de activos también se descodifica en esta carga:
{
"aud": ["https://your.devicebackend.com"],
"sub": "005WS000001c17CMJP",
"nbf": 1452537520,
"iss": "https://yoursite.com"
"cnf": {
"jwk": {
"kty": "RSA",
"e": "AQAB",
"use": "sig",
"alg": "RS256",
"n": "hPpe3TjbBS0pvw1h0d3mljvCl9ZxROX78Q4HKPeOB0OZiwC0ZIpmhwVddPyaqbIUu2oqBNFG7Kd8aS302mA Yd-snC7HryszGuc208R21ELlbpggV9IJv_svtL5xxR9Tv0_PTA4U2GHUnq5tWCNSjTHhbCsXskJiKIcx0tw7 kI2cZGMUA2ojA2oU5bAkH62RCAQ3Dp9qNKh6WqfYwUJrBUz51nhuDrq9y1QXMQ_zMdCW-5SPALM17zDIkj2_ qRvdz-BPHTObE8Yx7paezv3KHYkzkDwu3xjPhDdkW1DW1akh-suZPpYwI9xl2zECI1U5QWfOK3y20MmcHAmE xmAr2Dw"
}
},
"id": "05bD0000000005B",
"exp": "1453055917"
"aid": "02iD00000016GMg",
"did": "2c4c73e7-edc5-77dd-011d-43562d21cb7e"
"custom_attributes": {
"customattribute1": "unfiltered",
}
}
El encabezado del token de activos contiene estas reclamaciones.
| Reclamación | Descripción |
|---|---|
kid
|
La reclamación de Id. de clave identifica la clave pública específica de la organización asociada con su aplicación conectada. Se utiliza para verificar el bloque de firmas en un token de actor firmado. |
alg
|
Reclamación de algoritmo para identificar el algoritmo de firma. El valor debe ser RS256. |
typ
|
Identifica el tipo de token. El valor debe ser JWT. |
La carga de token de activos JWT contiene estas reclamaciones.
| Reclamación | Descripción |
|---|---|
iss
|
La reclamación del emisor identifica el emisor de JWT, que puede ser la URL de un sitio de Experience Cloud, la URL de inicio de sesión de Mi dominio o una URL de dominio personalizada. |
aud
|
La reclamación de audiencia identifica para quién está destinado el JWT. El valor es un conjunto de cadenas con distinción entre mayúsculas y minúsculas, cada una incluyendo un valor StringOrURI. Se especifica una audiencia para cada consumidor pensado del token de activos. |
sub
|
La reclamación del asunto identifica el Id. de 18 caracteres que no distingue entre mayúsculas del usuario actual del JWT. |
exp
|
La hora de caducidad identifica la hora cuando el JWT ya no se puede procesar. El valor debe ser un valor numérico representando el número de segundos desde 1970-01-01T00:00:00Z UTC hasta la fecha/hora UTC especificada, ignorando segundos intercalares. |
nbf
|
La reclamación no antes de identifica la hora antes de que el JWT pueda procesarse. El procesamiento de la reclamación nbf requiere que la fecha/hora actual sea posterior o igual a la fecha/hora no antes indicada en la reclamación nbf. El valor debe ser un valor numérico representando el número de segundos desde 1970-01-01T00:00:00Z UTC hasta la fecha/hora UTC especificada, ignorando segundos intercalares. |
did
|
La reclamación de Id. de dispositivo representa el Id. de su dispositivo. Si el token de actor incluye una reclamación did, se incluye en el token de activos. |
aid
|
La reclamación de Id. de activo representa el Id. del activo nuevo o existente con el que está vinculado el token de acceso. |
cnf
|
La reclamación de confirmación contiene una clave RSA específica del dispositivo en formato Clave de JSON Web, como se define en la especificación Semántica clave de prueba de posesión para tokens JSON Web. Se utiliza para verificar Prueba de posesión de la clave privada del dispositivo. |
| Reclamaciones adicionales | Las reclamaciones adicionales pueden incluir atributos personalizados o permisos personalizados que especificó en su aplicación conectada. |
Salesforce intenta vincular el token de activo con un activo existente o crear un activo, empleando este modelo de decisiones.
- Si la reclamación de activos contiene una reclamación de Id., Salesforce intenta vincular un activo existente con un Id. coincidente.
- Si la reclamación de activos contiene una reclamación de número de serie, Salesforce intenta vincular un activo existente con un número de serie coincidente.
- Si el activo contiene una reclamación de nombre, Salesforce crea (registra) un activo.
Nota La creación de un activo requiere AccountId o ContactId de activo. - En caso contrario, Salesforce no vincula o crea un activo. Puede vincular un activo por separado más adelante, a través de la API.
Salesforce publica un evento de token de activos
Si el token de actor y el token de acceso se intercambian para un token de activos, Salesforce publica un evento de token de activos. Para obtener más información acerca del objeto AssetTokenEvent y un ejemplo de cómo desencadenar una acción después de un evento de token de activos, consulte AssetTokenEvent.

