Node.js 애플리케이션과 Oracle Identity Cloud Service 간의 인증에 대해 알아보기

Node.js 웹 애플리케이션과 Oracle Identity Cloud Service 간 인증에 대해 배울 준비가 되었습니다. 여기에는 다음이 포함됩니다.

  • Oracle Identity Cloud Service(Node.js SDK) 를 지원하는 양도 인증 플로우입니다.

  • Node.js 애플리케이션과 함께 SDK를 사용하여 Oracle Identity Cloud Service 인증을 수행하는 경우 사용

  • Node.js SDK의 메소드 및 기능

위협 인증 플로우에 대해 알아보기

Oracle Identity Cloud Service 은 Node.js SDK에 대해 규정된 인증 플로우를 지원합니다. 이 플로우에서 사용자는 Oracle Identity Cloud Service 직접 상호 작용합니다. 사용자가 사인인한 후 Oracle Identity Cloud Service SDK가 사용자 액세스 토큰에 대해 교환하는 권한 부여 코드를 발행합니다. Node.js 웹 응용 프로그램은 이 액세스 토큰을 사용하여 응용 프로그램의 보호된 리소스에 대한 액세스 권한을 사용자에게 부여합니다. 권한 부여 코드 권한 부여 유형을 사용하는 세 가지 플로우입니다.

보안 강화를 위해 Oracle은 Node.js 웹 애플리케이션을 Oracle Identity Cloud Service와 통합하여 인증을 위해 Oracle Identity Cloud Service와 통합할 것을 권장합니다. 권한 부여 코드 권한 부여 유형을 사용하면 재인증 없이 Oracle Identity Cloud Service 로 보호되는 다른 애플리케이션에도 액세스할 수 있습니다.

Node.js 애플리케이션에서 SDK 사용에 대한 기본 사용 사례 학습

Node.js 웹 응용 프로그램은 사용자 인증에 사용되는 두 가지 사용 사례와 로그인한 사용자에 대한 세부 정보에 액세스하는 다른 사용 사례를 구현합니다.

다음 데이터 플로우 다이어그램은 각 사용 사례에 대해 웹 브라우저, 웹 애플리케이션, Oracle Identity Cloud Service 간의 이벤트, 호출 및 응답 플로우를 보여줍니다.

사용 사례 # 1: 사용자 인증

데이터 플로우는 다음과 같은 방식으로 발생합니다.

  1. 사용자가 보호된 리소스를 요청합니다.

  2. 인증 모듈은 SDK를 사용하여 Oracle Identity Cloud Service 요청 승인 코드 URL을 생성하고 이 URL을 웹 브라우저에 재지정 응답으로 보냅니다.

  3. 웹 브라우저가 URL을 호출합니다.

  4. [Oracle Identity Cloud Service 사인인 ] 페이지가 나타납니다.

  5. 사용자가 Oracle Identity Cloud Service 사인인 인증서를 제출합니다.

  6. 사용자가 사인인한 후 Oracle Identity Cloud Service 사용자가 세션을 생성하고 권한 부여 코드를 실행합니다.

  7. 웹 응용 프로그램은 백엔드(또는 서버간) 호출을 통해 사용자 액세스 토큰에 대한 권한 부여 코드를 교환합니다.

  8. Oracle Identity Cloud Service 액세스 토큰을 발행합니다.

  9. 세션이 설정되고 사용자가 페이지로 재지정됩니다.

  10. 웹 응용 프로그램의 페이지가 나타납니다.

사용 사례 # 2: 사용자에 대한 세부정보 가져오기

데이터 플로우는 다음과 같은 방식으로 발생합니다.

  1. 사용자가 /myProfile 리소스를 요청합니다.

  2. 웹 애플리케이션은 SDK를 사용하여 Oracle Identity Cloud Service 을 호출합니다. 그러면 사용자 세션에 매개변수로 저장된 액세스 토큰이 사용됩니다.

  3. 사용자 세부정보가 JSON 객체로 웹 애플리케이션으로 전송됩니다.

  4. [내 프로파일 ] 페이지는 JSON 객체를 HTML 콘텐츠로 렌더링합니다.

메소드 및 함수에 대해 알아보기

Node.js SDK는 Node.js modules 폴더에 추가하는 Node.js 여권 전략입니다. 이 SDK는 Node.js 약속도 기반으로 합니다. Node.js SDK에 필요한 모든 타사 종속성은 SDK의 package.json 파일에 정의되어 있습니다. Node.js 웹 애플리케이션에서 이 모듈 집합을 하나 이상 사용해야 합니다.

"dependencies": {
    "async": "^2.1.2",
    "bunyan": "^1.8.5",
    "cache-manager": "^2.2.0",
    "json-web-token": "^2.1.3",
    "jsonwebtoken": "^7.1.9",
    "jwk-to-pem": "^1.2.6",
    "jws": "^3.1.4",
    "lru": "^3.1.0",
    "passport": "^0.3.2",
    "promise": "^7.1.1",
    "querystring": "^0.2.0",
    "request": "^2.79.0",
    "rsa-pem-to-jwk": "^1.1.3",
    "util": "^0.10.3"
  },

Node.js 웹 애플리케이션은 Node.js Express 및 Express 막대 모듈을 사용하여 개발되었으며 , 각 URL에 대한 app.get () 함수 형식의 URL 경로를 구현합니다.

Node.js SDK에는 Oracle Identity Cloud Service 접속 정보로 로드된 JSON 변수가 필요합니다. Node.js 웹 응용 프로그램은 ids 변수를 사용하여 다음 정보를 저장합니다.

var ids = {
    oracle: {
         "ClientId": '123456789abcdefghij',
         "ClientSecret": 'abcde-12345-zyxvu-98765-qwerty',
         "ClientTenant": 'idcs-abcd1234',
         "IDCSHost": 'https://%tenant%.identity.oraclecloud.com',
         "AudienceServiceUrl" : 'https://idcs-abcd1234.identity.oraclecloud.com',
         "TokenIssuer": 'https://identity.oraclecloud.com/',
         "scope": 'urn:opc:idm:t.user.me openid',
         "logoutSufix": '/oauth2/v1/userlogout',
         "redirectURL": 'http://localhost:3000/callback'
    }
};
 
module.exports = ids;

다음은 이 SDK의 각 필수 속성에 대한 간략한 설명입니다.

이름 설명
ClientId Node.js 콘솔에서 Identity Cloud Service 웹 애플리케이션을 등록한 후 생성되는 클라이언트 ID의 값입니다.
ClientSecret Node.js 콘솔에서 Identity Cloud Service 웹 애플리케이션을 등록한 후 생성되는 클라이언트 암호의 값입니다.
ClientTenant Oracle Identity Cloud Service 인스턴스의 도메인 접두어입니다. 이 접두어는 일반적으로 idcs-abcd1234 과 유사합니다.
IDCSHost Oracle Identity Cloud Service 인스턴스의 도메인 접미어입니다. 런타임 시 % tenant % 자리 표시자는 ClientTenant 속성의 값으로 바뀝니다.
AudienceServiceUrl Oracle Identity Cloud Service 인스턴스의 전체 도메인 이름 URL입니다.
TokenIssuer 이 속성의 경우 Oracle 값을 https://identity.oraclecloud.com/ 로 유지하는 것이 좋습니다.
scope

범위는 애플리케이션이 Oracle Identity Cloud Service 사용자를 대신하여 액세스하거나 처리할 수 있는 데이터를 제어합니다.

애플리케이션이 SDK를 사용하여 사용자를 인증하는 경우 범위는 openid 입니다. 응용 프로그램이 SDK를 사용하여 사용자에 대한 세부 정보를 가져오는 경우 범위는 urn:opc:idm:t.user.me openid 입니다.

응용 프로그램은 logoutSufixredirectURL 속성을 모두 사용합니다. SDK에는 해당 SDK가 필요하지 않습니다.

Node.js 응용 프로그램은 /oauth/oracle URL 경로를 구현합니다. 사용자가 Oracle Identity Cloud Service 인증을 결정하면 웹 브라우저가 이 URL을 요청합니다. 이 경로는 SDK를 사용하여 Oracle Identity Cloud Service 권한 부여 URL을 생성합니다.

//Loading the configurations
var auth = require('./auth.js');
 
//Route for /oauth/oracle
app.get("/auth/oracle", function(req, res){
    //Authentication Manager loaded with the configurations.
    am = new IdcsAuthenticationManager(auth.oracle);
    //Using Authentication Manager to generate the Authorization Code URL, passing the
    //application's callback URL as parameter, along with code value and code parameter.
    am.getAuthorizationCodeUrl(auth.oracle.redirectURL, auth.oracle.scope, "1234", "code")
        .then(function(authZurl){
            //Redirecting the browser to the Oracle Identity Cloud Service Authorization URL.
            res.redirect(authZurl);
        }).catch(function(err){
            res.end(err);
        })
});

이 함수는 JSON 매개변수를 변수에 로드하고, 인증 관리자를 초기화하고, Node.js SDK의 IdcsAuthenticationManager.getAuthorizationCodeUrl() 함수를 사용하여 권한 부여 코드 URL을 생성합니다. 이 함수는 권한 부여 코드 URL이 생성될 때 사용자의 웹 브라우저를 재지정하거나 브라우저에서 오류를 렌더링하는 데 약속을 사용합니다.

다음 매개변수는 권한 부여 코드 URL을 생성하는 데 사용됩니다.

이름 설명
auth.oracle.redirectURL 사용자가 사인인한 후 Oracle Identity Cloud Service 는 사용자의 웹 브라우저를 이 URL로 재지정합니다. 이 URL은 Identity Cloud Service 콘솔에서 보안 애플리케이션에 대해 구성할 URL과 일치해야 합니다. Node.js 웹 애플리케이션의 재지정 URL 지정에 대한 자세한 내용은 Node.js 애플리케이션 등록 을 참조하십시오.
auth.oracle.scope 인증의 OAuth 또는 OpenID 접속 범위입니다. 이 애플리케이션에는 openid 인증만 필요합니다.
state OAuth 프로토콜은 이 매개변수를 정의합니다. 샘플 Node.js 웹 애플리케이션은 이 코드를 사용하여 Oracle Identity Cloud Service 통신에 대한 통신을 설정할 수 있는지 여부를 확인합니다. 이 예에서 이 매개변수의 값은 1234 입니다.
response_type 권한 부여 코드 권한 부여 유형에 필요한 매개변수입니다. 이 예에서 이 매개변수의 값은 code 입니다.

사용자가 사인인한 후 Oracle Identity Cloud Service 는 사용자의 웹 브라우저를 콜백 URL로 재지정하며 개발자가 구현해야 합니다. Node.js 웹 응용 프로그램은 /callback 경로를 사용하여 이 요청을 처리합니다.

//Route for /callback
app.get("/callback", function(req,res){
    //Authentication Manager loaded with the configurations.
    var am = new IdcsAuthenticationManager(auth.oracle);
    //Getting the authorization code from the "code" parameter
    var authZcode = req.query.code;
    //Using the Authentication Manager to exchange the Authorization Code to an Access Token.
    am.authorizationCode(authZcode)
        .then(function(result){
            //Getting the Access Token Value.
            res.cookie(config.IDCS_COOKIE_NAME, result.access_token);
            res.redirect('/auth.html');
        }).catch(function(err){
            res.end(err);
        })
});

Node.js 애플리케이션은 권한 부여 코드를 사용하여 액세스 토큰을 요청합니다. 액세스 토큰은 쿠키로 저장되며 이 쿠키는 나중에 사용할 수 있도록 웹 브라우저에 전송됩니다.

Node.js SDK의 IdcsAuthenticationManager.authorizationCode() 함수는 약속(then-catch 문) 을 사용하여 액세스 토큰을 쿠키로 설정하고 브라우저를 /auth.html 페이지로 재지정합니다.

Node.js SDK는 Node.js 여권 프레임워크를 기반으로 합니다. 따라서 액세스 토큰을/auth URL 처리기에 헤더 변수로 전달하고 Oracle Identity Cloud Service 전략 이름과 함께 passport.authenticate () 메소드를 매개변수로 사용해야 합니다.

//Uses passport to create a User Session in Node.js.
//Passport sets a user attribute in the request as a json object.
app.get('/auth', passport.authenticate(config.IDCS_STRATEGY_NAME, {}), function(req, res) {
   res.redirect('/home');
});

passport.authenticate() 메소드가 응용 프로그램의 세션을 생성한 후 이 함수는 사용자의 웹 브라우저를 /home 응용 프로그램의 보호된 URL로 재지정합니다. /home 외에도, Node.js 웹 응용 프로그램에는 URLs(/appDetails, /userInfo/myProfile) 의 세 가지가 있습니다.

각 보호된 URL은 사용자의 세션이 이전에 생성되었는지 여부를 확인해야 합니다. 다음 함수는 이러한 URL의 각 app.get () 함수에서 사용됩니다.

function ensureAuthenticated(req, res, next) {
   if (req.isAuthenticated()) {
      return next();
   }
   res.redirect('/login')
}

Node.js 애플리케이션은 다음과 같이 /myProfile 경로를 처리하고 세션에 설정된 정보를 passport.authenticate() 메소드로 가져옵니다.

app.get("/myProfile", ensureAuthenticated, function(req,res){
   //User Manager loaded with the configurations
   var um = new IdcsUserManager(auth.oracle);
   //Using the user id in the request attribute to render the user json in the screen.
   um.getUser(req.user.id)
      .then(function(user){
         res.render('myProfile', {
         layout: 'privateLayout',
         title: 'My Profile',
         user: req.user,
         userInfo: JSON.stringify(user, null, 2)
         });
      }).catch(function(err1){
         res.end(err1);
      })
});

UserManager 객체를 초기화한 후 /myProfile 경로 지정 처리기는 SDK의 IdcsUserManager.getUser() 함수를 사용하여 사용자 프로파일을 나타내는 JSON 객체를 가져옵니다. 애플리케이션은 웹 브라우저에 렌더링하기 위해 JSON 객체를 myProfile.handlebars 파일로 보냅니다.

응용 프로그램과 Oracle Identity Cloud Service 사이의 Single Sign-On에서 사용자를 사인아웃하려면 Node.js 웹 응용 프로그램이 다음과 같이 /logout 경로를 구현합니다.

app.get('/logout', function(req, res){
   req.logout();
   res.clearCookie();
   res.redirect(auth.oracle.IDCSHost + auth.oracle.logoutSufix);
});

이 경로는 애플리케이션의 세션을 무효화하고 이전에 설정된 쿠키를 제거한 다음 사용자의 웹 브라우저를 Oracle Identity Cloud Service 's OAuth 로그아웃 URL로 재지정합니다. 이 URL은 JSON 구성 객체에서 설정됩니다.