애플리케이션 ID 및 권한
IBM Cloud® App ID를 사용하는 경우 OAuth2.0 기능을 활용하여 애플리케이션 ID 및 권한 플로우를 통해 애플리케이션에 보안을 설정할 수 있습니다.
통신 플로우에 대한 정보
사용자 개입 없이 하나의 애플리케이션에서 다른 서비스 또는 앱과 통신하기를 원하는 몇 가지 이유가 있습니다. 예를 들어 해당 작업을 수행하기 위해 다른 애플리케이션에 액세스해야 하는 비대화식 앱이 있습니다. 이 앱에는 환경 변수를 모니터링하고 업스트림 서버에 보고하는 CLI, 디먼 또는 IoT 디바이스가 포함될 수 있습니다. 특정 유스 케이스는 각 애플리케이션에 대해 고유하지만 기억해야 할 가장 중요한 내용은 일반 사용자가 아닌 앱을 대신하여 요청이 교환되며 인증 및 권한 부여되는 대상이 앱이라는 점입니다.
이 플로우는 어떻게 작동합니까?
App ID의 경우 OAuth 2.0 클라이언트 인증 정보 플로우를 활용하여 통신을 보호합니다. 앱이 App ID에 등록되면 해당 앱은 클라이언트 ID 및 시크릿을 얻게 됩니다. 앱은 이 정보를 통해 App ID의 액세스 토큰을 요청하고 보호된 리소스 또는 API에 액세스할 수 있는 권한을 부여받을 수 있습니다. 애플리케이션 ID 및 권한 플로우에서 애플리케이션에는 액세스 토큰만 부여됩니다. ID 토큰 또는 새로 고치기 토큰은 얻지 못합니다. 토큰에 대한 자세한 정보는 토큰 이해를 참조하십시오.
이 워크플로우는 비밀이 오용되거나 유출될 위험이 없는 신뢰할 수 있는 애플리케이션에서만 사용하도록 되어 있습니다. 애플리케이션의 경우 항상 클라이언트 시크릿을 보유하고 있습니다. 모바일 앱에서는 작동하지 않습니다.
이 플로우의 형태는 어떻습니까?
다음 이미지에서 서비스와 애플리케이션 간의 통신 방향을 확인할 수 있습니다.
- 보호된 리소스에 액세스하기 위해 인증해야 하는 애플리케이션을 App ID에 등록하십시오.
- 애플리케이션 A는 App ID에 등록되어 클라이언트 ID 및 시크릿을 얻습니다.
- 애플리케이션 A는 이전 단계에서 검색된 인증 정보를 전송하여 App ID 권한 서버
/token엔드포인트에 대한 요청을 합니다. - App ID에서 요청을 유효성 검증하고 앱을 인증한 후 애플리케이션 A에 액세스 토큰이 포함된 응답을 리턴합니다.
- 이제 애플리케이션 A에서 올바른 액세스 토큰을 사용하여 보호된 리소스(예: 애플리케이션 B)에 요청을 전송할 수 있습니다.
클라이언트 인증에 사용되는 클라이언트 시크릿은 매우 중요하므로 기밀 상태로 유지해야 합니다. 애플리케이션은 앱 내에서 클라이언트 비밀을 사용하기 때문에 이 워크플로우는 신뢰할 수 있는 애플리케이션에서만 사용해야 합니다. 신뢰할 수 있는 애플리케이션을 사용하면 클라이언트 시크릿이 유출되거나 오용되지 않습니다.
앱 등록
GUI 사용
- App ID 대시보드의 애플리케이션 탭에서 애플리케이션 추가를 클릭하십시오.
- 애플리케이션을 이름을 추가한 후 저장을 클릭하여 등록된 앱 목록으로 돌아가십시오. 애플리케이션 이름은 50자를 초과할 수 없습니다.
- 등록된 앱 목록에서 이전 단계에 추가한 애플리케이션을 선택하십시오. 해당 행이 펼쳐지면서 인증 정보가 표시됩니다.
API 사용
-
/management/v4/<tenantID>/applications엔드포인트에 대한 POST 요청을 작성하십시오.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>"}'리소스 예:
{ "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" }
액세스 토큰 얻기
앱이 App ID에 등록되어 인증 정보를 얻은 후에는 액세스 토큰을 가져오기 위해 App ID 권한 서버에 대한 요청을 할 수 있습니다.
-
/token엔드포인트에 HTTP POST 요청을 합니다. 해당 요청에 대한 권한 부여는 클라이언트 ID 및 시크릿이 base64 인코딩된 사용자 이름 및 비밀번호로 사용되는Basic auth입니다.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'리소스 예:
{ "access_token": "eyJhbGciOiJS...F9A", "expires_in": "3600", "token_type": "Bearer" }
튜토리얼: Node.js SDK와 관련된 엔드 투 엔드 플로우
-
다음 방법 중 하나를 사용하여 액세스 토큰을 얻으십시오.
-
토큰 관리자를 사용하여 App ID Node.js 서버 SDK에서. 앱 인증 정보를 사용하여 토큰 관리자를 초기화한 후
getApplicationIdentityToken()메소드에 대한 호출을 작성하여 토큰을 얻으십시오.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); }); -
App ID 권한 서버에서 다음 작업을 수행하십시오.
요청에 있는
oauthServerUrl은 애플리케이션을 등록할 때 얻게 됩니다. 관리 API를 사용하여 앱을 등록한 경우 서버 URL은 응답 본문에 있습니다. IBM Cloud 콘솔에 바인딩하여 앱을 등록한 경우 VCAP_SERVICES JSON 오브젝트에서 또는 Kubernetes 시크릿을 통해 해당 URL을 찾을 수 있습니다.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); } }) }); }
-
-
이전 단계에서 얻은 액세스 토큰을 사용하여 보호된 리소스에 대한 요청을 작성하십시오.
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)); }); } }); -
App ID Node.js SDK에서 API 전략을 사용하여 보호된 리소스에 보안을 설정하십시오.
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"); });