Autorización e identidad de la aplicación
Con IBM Cloud® App ID, puede proteger las aplicaciones utilizando el flujo de autorización e identidad de la aplicación optimizando las prestaciones de OAuth2.0.
Comprensión del flujo de comunicación
Existen varias razones por las que es posible que desee que una aplicación se comunique con otro servicio o app sin la intervención de ningún usuario. Por ejemplo, una app no interactiva que necesita acceder a otra aplicación para realizar su trabajo. Esto podría incluir procesos, CLI, daemons o un dispositivo IoT que supervise e informe acerca de las variables de entorno a un servidor en sentido ascendente. El caso de uso específico es único de cada aplicación, pero lo más importante que se debe recordar es que las solicitudes se intercambian en nombre de la app, no del usuario final, y es la app la que se autentica y autoriza.
¿Cómo funciona el flujo?
App ID optimiza el flujo de las credenciales del cliente OAuth 2.0 para proteger la comunicación. Después de que una app se registre con App ID, esta obtiene un ID de cliente y un secreto. Con esta información, la app puede solicitar una señal de acceso de App ID y obtener autorización para acceder a un recurso o API protegidos. En el flujo de autorización e identidad de la aplicación, esta obtiene únicamente una señal de acceso. No obtiene una señal de identidad o de renovación. Para obtener más información sobre las señales, consulte Comprensión de las señales.
Este flujo de trabajo está pensado para ser utilizado únicamente con aplicaciones de confianza en las que no haya riesgo de que el secreto se utilice indebidamente o se filtre. La aplicación siempre mantiene el secreto del cliente. No funcionará en apps para móvil.
¿Qué aspecto tiene el flujo?
En la imagen siguiente, puede ver la dirección de la comunicación entre el servicio y la aplicación.
- Se debe registrar la aplicación que necesita autenticarse para acceder a un recurso protegido con App ID.
- La aplicación A se registra con App ID para obtener un ID de cliente y un secreto.
- La aplicación A realiza una solicitud al punto final
/token
del servidor de autorización de App ID enviando las credenciales recuperadas en el paso anterior. - App ID valida la solicitud, autentica la app y devuelve una respuesta a la aplicación A que contiene una señal de acceso.
- La aplicación A ahora puede utilizar la señal de acceso válida para enviar solicitudes a recursos protegidos como por ejemplo la aplicación B.
El secreto de cliente que se utiliza para autenticar el cliente es muy sensible y se debe mantener en secreto. Dado que la aplicación utiliza el secreto de cliente in-app, este flujo de trabajo sólo debe utilizarse con aplicaciones de confianza. El uso de una aplicación de confianza garantiza que el secreto de cliente no se filtre ni se haga un mal uso del mismo.
Registro de la app
Con la GUI
- En el separador Aplicación del panel de control de App ID, pulse Añadir aplicación.
- Añada el nombre de la aplicación y pulse Guardar para volver a una lista de las apps registradas. El nombre de la aplicación no puede superar los 50 caracteres.
- En la lista de apps registradas, seleccione la aplicación que ha añadido en el paso anterior. La fila se expande para mostrar las credenciales.
Con la API
-
Realice una solicitud POST al punto final de
/management/v4/<tenantID>/applications
.curl -X POST \ https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/applications/ \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer <IAMToken>' \ -d '{"name": "<applicationName>"}'
Respuesta de ejemplo:
{ "clientId": "c90830bf-11b0-4b44-bffe-9773f8703bad", "tenantId": "b42f7429-fc24-48fa-b4f9-616bcc31cfd5", "secret": "YWQyNjdkZjMtMGRhZC00ZWRkLThiOTQtN2E3ODEyZjhkOWQz", "name": "testing", "oAuthServerUrl": "https://us-south.appid.cloud.ibm.com/oauth/v4/b42f7429-fc24-48fa-b4f9-616bcb31cfd5", "profilesUrl": "https://us-south.appid.cloud.ibm.com", "discoveryEndpoint": "https://us-south.appid.cloud.ibm.com/oauth/v4/b42f7429-fc24-48fa-b4f9-616bcb31cfd5/.well-known/openid-configuration" }
Obtención de una señal de acceso
Una vez que haya registrado la app con App ID y haya obtenido las credenciales, puede realizar una solicitud al servidor de autorización App ID para obtener una señal de acceso.
-
Realice una solicitud POST HTTP al punto final
/token
. La autorización para la solicitud esBasic auth
con el ID de cliente y el secreto que se utilizan como nombre de usuario y contraseña codificados en base64.curl -X POST https://<region>.appid.cloud.ibm.com/oauth/v4/<tenantID>/token \ -H 'Authorization: Basic base64Encoded{clientId:secret}' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -d 'grant_type=client_credentials'
Respuesta de ejemplo:
{ "access_token": "eyJhbGciOiJS...F9A", "expires_in": "3600", "token_type": "Bearer" }
Guía de aprendizaje: Flujo de extremo a extremo con el SDK de Node.js
-
Obtenga una señal de acceso de una de las formas siguientes:
-
Desde el SDK del servidor Node.js App ID mediante el administrador de tokens. Inicialice el gestor de señales con las credenciales de la app y llame al método
getApplicationIdentityToken()
para obtener la señal.const TokenManager = require('ibmcloud-appid').TokenManager; const config = { clientId: "<clientID>", tenantId: "<tenantID>", secret: "{secret}", oauthServerUrl: "https://<region>.appid.cloud.ibm.com/oauth/v4/<tenantID>" }; const tokenManager = new TokenManager(config); tokenManager.getApplicationIdentityToken().then((appIdAuthContext) => { console.log(' Access tokens from SDK : ' + JSON.stringify(appIdAuthContext)); }).catch((err) => { //console.error('Error retrieving tokens : ' + err); });
-
Desde el servidor de autorización de App ID.
El
oauthServerUrl
de la solicitud se obtiene cuando se registra en la aplicación. Si ha registrado la app con las API de gestión, el URL del servidor se encontrará en el cuerpo de respuesta. Si ha registrado la app enlazándola con la consola de IBM Cloud, podrá encontrar el URL en el objeto JSON VCAP_SERVICES o mediante los secretos de Kubernetes.var request = require('request'); function getAccessToken() { let options = { method: 'POST', url: oauthServerUrl + '/token', headers: { 'content-type': 'application/x-www-form-urlencoded', 'Authorization': 'Basic ' +Buffer.from('clientId: secret').toString('base64') }, form: { grant_type: 'client_credentials' } }; return new Promise((resolve, reject) => { request(options, function (error, response, body) { if (error) { return reject(error); } let data = JSON.parse(body); if(data.access_token) { resolve(data.access_token); } else { reject(data); } }) }); }
-
-
Realice una solicitud al recurso protegido utilizando la señal de acceso que ha obtenido en el paso anterior.
let options = { method: 'GET', url: 'http://localhost:8081/protected_resource', headers: { authorization : 'Bearer ' + accessToken} } request(options, function (error, response, body) { if (error) { console.log(error) } else { res.status(response.statusCode).send({ console.log(JSON.stringify(body)); }); } });
-
Asegure los recursos protegidos utilizando la estrategia de API del SDK del Node.js de App ID.
const express = require('express'), passport = require('passport'); APIStrategy = require("ibmcloud-appid").APIStrategy; var app = express(); app.use(passport.initialize()); passport.use(new APIStrategy({ oauthServerUrl: "https://{region}.appid.cloud.ibm.com/oauth/v4/{tenant-ID}", tenantId:"{tenant-ID}" })); app.get('/protected_resource', passport.authenticate(APIStrategy.STRATEGY_NAME, {session: false}), (req, res) => { res.send("Hello from protected resource"); });