애플리케이션 ID 및 권한

IBM Cloud® App ID를 사용하는 경우 OAuth2.0 기능을 활용하여 애플리케이션 ID 및 권한 플로우를 통해 애플리케이션에 보안을 설정할 수 있습니다.

통신 플로우에 대한 정보

사용자 개입 없이 하나의 애플리케이션에서 다른 서비스 또는 앱과 통신하기를 원하는 몇 가지 이유가 있습니다. 예를 들어 해당 작업을 수행하기 위해 다른 애플리케이션에 액세스해야 하는 비대화식 앱이 있습니다. 이 앱에는 환경 변수를 모니터링하고 업스트림 서버에 보고하는 CLI, 디먼 또는 IoT 디바이스가 포함될 수 있습니다. 특정 유스 케이스는 각 애플리케이션에 대해 고유하지만 기억해야 할 가장 중요한 내용은 일반 사용자가 아닌 앱을 대신하여 요청이 교환되며 인증 및 권한 부여되는 대상이 앱이라는 점입니다.

이 플로우는 어떻게 작동합니까?

App ID의 경우 OAuth 2.0 클라이언트 인증 정보 플로우를 활용하여 통신을 보호합니다. 앱이 App ID에 등록되면 해당 앱은 클라이언트 ID 및 시크릿을 얻게 됩니다. 앱은 이 정보를 통해 App ID의 액세스 토큰을 요청하고 보호된 리소스 또는 API에 액세스할 수 있는 권한을 부여받을 수 있습니다. 애플리케이션 ID 및 권한 플로우에서 애플리케이션에는 액세스 토큰만 부여됩니다. ID 토큰 또는 새로 고치기 토큰은 얻지 못합니다. 토큰에 대한 자세한 정보는 토큰 이해를 참조하십시오.

이 워크플로우는 비밀이 오용되거나 유출될 위험이 없는 신뢰할 수 있는 애플리케이션에서만 사용하도록 되어 있습니다. 애플리케이션의 경우 항상 클라이언트 시크릿을 보유하고 있습니다. 모바일 앱에서는 작동하지 않습니다.

이 플로우의 형태는 어떻습니까?

다음 이미지에서 서비스와 애플리케이션 간의 통신 방향을 확인할 수 있습니다.

caption-side=bottom"
App ID 애플리케이션 ID 및 권한 부여 흐름 애플리케이션 ID 및 권한 부여 흐름

  1. 보호된 리소스에 액세스하기 위해 인증해야 하는 애플리케이션을 App ID에 등록하십시오.
  2. 애플리케이션 A는 App ID에 등록되어 클라이언트 ID 및 시크릿을 얻습니다.
  3. 애플리케이션 A는 이전 단계에서 검색된 인증 정보를 전송하여 App ID 권한 서버 /token 엔드포인트에 대한 요청을 합니다.
  4. App ID에서 요청을 유효성 검증하고 앱을 인증한 후 애플리케이션 A에 액세스 토큰이 포함된 응답을 리턴합니다.
  5. 이제 애플리케이션 A에서 올바른 액세스 토큰을 사용하여 보호된 리소스(예: 애플리케이션 B)에 요청을 전송할 수 있습니다.

클라이언트 인증에 사용되는 클라이언트 시크릿은 매우 중요하므로 기밀 상태로 유지해야 합니다. 애플리케이션은 앱 내에서 클라이언트 비밀을 사용하기 때문에 이 워크플로우는 신뢰할 수 있는 애플리케이션에서만 사용해야 합니다. 신뢰할 수 있는 애플리케이션을 사용하면 클라이언트 시크릿이 유출되거나 오용되지 않습니다.

앱 등록

GUI 사용

  1. App ID 대시보드의 애플리케이션 탭에서 애플리케이션 추가를 클릭하십시오.
  2. 애플리케이션을 이름을 추가한 후 저장을 클릭하여 등록된 앱 목록으로 돌아가십시오. 애플리케이션 이름은 50자를 초과할 수 없습니다.
  3. 등록된 앱 목록에서 이전 단계에 추가한 애플리케이션을 선택하십시오. 해당 행이 펼쳐지면서 인증 정보가 표시됩니다.

API 사용

  1. /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 권한 서버에 대한 요청을 할 수 있습니다.

  1. /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와 관련된 엔드 투 엔드 플로우

  1. 다음 방법 중 하나를 사용하여 액세스 토큰을 얻으십시오.

    • 토큰 관리자를 사용하여 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);
               }
            })
      });
      }
      
  2. 이전 단계에서 얻은 액세스 토큰을 사용하여 보호된 리소스에 대한 요청을 작성하십시오.

    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));
             });
       }
    });
    
  3. 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");
    });