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: 사용자 인증
데이터 플로우는 다음과 같은 방식으로 발생합니다.
-
사용자가 보호된 리소스를 요청합니다.
-
인증 모듈은 SDK를 사용하여 Oracle Identity Cloud Service 요청 승인 코드 URL을 생성하고 이 URL을 웹 브라우저에 재지정 응답으로 보냅니다.
-
웹 브라우저가 URL을 호출합니다.
-
[Oracle Identity Cloud Service 사인인 ] 페이지가 나타납니다.
-
사용자가 Oracle Identity Cloud Service 사인인 인증서를 제출합니다.
-
사용자가 사인인한 후 Oracle Identity Cloud Service 사용자가 세션을 생성하고 권한 부여 코드를 실행합니다.
-
웹 응용 프로그램은 백엔드(또는 서버간) 호출을 통해 사용자 액세스 토큰에 대한 권한 부여 코드를 교환합니다.
-
Oracle Identity Cloud Service 액세스 토큰을 발행합니다.
-
세션이 설정되고 사용자가 홈 페이지로 재지정됩니다.
-
웹 응용 프로그램의 홈 페이지가 나타납니다.
사용 사례 # 2: 사용자에 대한 세부정보 가져오기
데이터 플로우는 다음과 같은 방식으로 발생합니다.
-
사용자가
/myProfile
리소스를 요청합니다. -
웹 애플리케이션은 SDK를 사용하여 Oracle Identity Cloud Service 을 호출합니다. 그러면 사용자 세션에 매개변수로 저장된 액세스 토큰이 사용됩니다.
-
사용자 세부정보가 JSON 객체로 웹 애플리케이션으로 전송됩니다.
-
[내 프로파일 ] 페이지는 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를 사용하여 사용자를 인증하는 경우 범위는 |
응용 프로그램은 logoutSufix
및 redirectURL
속성을 모두 사용합니다. 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 구성 객체에서 설정됩니다.