Identità e autorizzazione dell'applicazione
Con IBM Cloud® App ID, puoi proteggere le applicazioni utilizzando il flusso di identità e autorizzazione dell'applicazione tramite le funzionalità OAuth2.0.
Descrizione del flusso di comunicazione
Esistono diversi motivi per cui potresti volere che un'applicazione comunichi con un altro servizio o applicazione senza alcun intervento da parte dell'utente. Ad esempio, un'applicazione non interattiva che deve accedere a un'altra applicazione per eseguire il proprio lavoro. Questo potrebbe includere processi, CLI, daemon o un dispositivo IoT che monitora e segnala le variabili di ambiente a un server upstream. Il caso di utilizzo specifico è univoco per ogni applicazione, ma la cosa più importante da ricordare è che le richieste vengono scambiate per conto dell'applicazione, non dell'utente finale, ed è l'applicazione che viene autenticata e autorizzata.
Come funziona il flusso?
App ID utilizza il flusso di credenziali client OAuth 2.0 per proteggere la comunicazione. Dopo aver registrato un'applicazione con App ID, l'applicazione ottiene un segreto e un ID client. Con queste informazioni, l'applicazione può richiedere un token di accesso da App ID ed essere autorizzata ad accedere a un'API o una risorsa protetta. Nel flusso di identità e autorizzazione dell'applicazione, all'applicazione viene concesso solo un token di accesso. Non ottiene un token di identità o un token di aggiornamento. Per ulteriori informazioni sui token, consulta Descrizione dei token.
Questo flusso di lavoro deve essere utilizzato solo con applicazioni fidate, dove non c'è il rischio che il segreto venga usato in modo improprio o trapelato. L'applicazione ospita sempre il segreto client. Non funzionerà per le applicazioni mobili.
Come si presenta il flusso?
Nella seguente immagine, puoi vedere la direzione della comunicazione tra il servizio e la tua applicazione.
- Registra l'applicazione che deve essere autenticata per accedere a una risorsa protetta con App ID.
- L'applicazione A viene registrata con App ID per ottenere un segreto e un ID client.
- L'applicazione A effettua una richiesta all'endpoint
/tokendel server di autorizzazione App ID inviando le credenziali richiamate nel passo precedente. - App ID convalida la richiesta, autentica l'applicazione e restituisce una risposta all'applicazione A che contiene un token di accesso.
- L'applicazione A può ora utilizzare il token di accesso valido per inviare delle richieste alle risorse protette come ad esempio l'applicazione B.
Il segreto client utilizzato per autenticare il client è altamente sensibile e deve essere mantenuto confidenziale. Poiché l'applicazione utilizza il segreto del cliente all'interno dell'applicazione, questo flusso di lavoro deve essere utilizzato solo con applicazioni affidabili. L'utilizzo di un'applicazione affidabile garantisce che il segreto client non venga utilizzato in modo improprio o fatto trapelare.
Registrazione della tua applicazione
Con la GUI
- Nella scheda Application del dashboard App ID, fai clic su Add Application.
- Aggiungi il tuo nome dell'applicazione a fai clic su Save per ritornare a un elenco di tue applicazioni registrate. Il nome della tua applicazione non può superare i 50 caratteri.
- Dall'elenco delle applicazioni registrate, seleziona l'applicazione che hai aggiunto nel passo precedente. La riga si espande per mostrare le tue credenziali.
Con l'API
-
Effettuare una richiesta POST all'endpoint
/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>"}'Risposta di esempio:
{ "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" }
Ottenimento di un token di accesso
Dopo aver registrato la tua applicazione con App ID e aver ottenuto le tue credenziali, puoi effettuare una richiesta al server di autorizzazione App ID per ottenere un token di accesso.
-
Effettuare una richiesta HTTP POST all'endpoint
/token. L'autorizzazione per la richiesta èBasic authcon il segreto e l'ID client utilizzati come la password e il nome utente codificati 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'Risposta di esempio:
{ "access_token": "eyJhbGciOiJS...F9A", "expires_in": "3600", "token_type": "Bearer" }
Esercitazione: flusso end-to-end con l'SDK Node.js
-
Ottieni un token di accesso in uno dei seguenti modi:
-
Dal sito App ID Node.js server SDK utilizzando il gestore di token. Inizializza il gestore dei token con le tue credenziali dell'applicazione ed esegui una chiamata al metodo
getApplicationIdentityToken()per ottenere il token.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); }); -
Dal server di autorizzazione App ID.
L'
oauthServerUrlnella richiesta si ottiene quando registri la tua applicazione. Se hai registrato la tua applicazione con le API di gestione, l'URL del server si trova nel corpo della risposta. Se hai registrato la tua applicazione eseguendone il bind alla console IBM Cloud, è possibile trovare l'URL nel tuo oggetto JSON VCAP_SERVICES o tramite i tuoi segreti 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); } }) }); }
-
-
Esegui una richiesta alla tua risorsa protetta utilizzando il token di accesso che hai ottenuto nel passo precedente.
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)); }); } }); -
Proteggi le tue risorse protette utilizzando la strategia API dall'SDK App ID Node.js.
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"); });