Node.js 웹앱에서 액세스 토큰 획득
적용 대상: 인력 테넌트
외부 테넌트(자세히 알아보기)
이 문서에서는 웹앱이 액세스 토큰을 획득할 수 있도록 코드를 업데이트합니다. 노드용 MSAL(Microsoft 인증 라이브러리)을 사용하여 노드 웹 애플리케이션에 인증 및 권한 부여 추가를 간소화합니다. 이 문서는 4부로 구성된 가이드 시리즈의 세 번째 부분입니다.
필수 조건
- 이 가이드 시리즈의 첫 번째 부분인 Node.js 웹 애플리케이션에서 API를 호출할 외부 테넌트 준비를 완료하세요.
- 이 가이드 시리즈의 두 번째 부분인 Node.js 웹 애플리케이션에서 API를 호출하도록 앱 준비를 완료하세요.
MSAL 구성 개체 업데이트
코드 편집기에서 authConfig.js 파일을 연 다음, protectedResources
개체를 추가하여 코드를 업데이트합니다.
//..
const toDoListReadScope = process.env.TODOLIST_READ || 'api://Enter_the_Web_Api_Application_Id_Here/ToDoList.Read';
const toDoListReadWriteScope = process.env.TODOLIST_READWRITE || 'api://Enter_the_Web_Api_Application_Id_Here/ToDoList.ReadWrite';
const protectedResources = {
toDoListAPI: {
endpoint: 'https://localhost:44351/api/todolist',
scopes: {
read: [toDoListReadScope],
write: [toDoListReadWriteScope],
},
},
};
module.exports = {
//..
protectedResources,
//..
};
authConfig.js 파일에서 Enter_the_Web_Api_Application_Id_Here
을(를) 고객의 테넌트에 등록한 웹 API 앱의 애플리케이션(클라이언트) ID로 바꿉니다.
todolistReadScope
및 todolistReadWriteScope
변수는 외부 테넌트에서 설정한 웹 API 전체 범위 URL을 보유합니다. protectedResources
개체를 내보내야 합니다.
액세스 토큰 가져오기
코드 편집기에서 auth/AuthProvider.js 파일을 연 다음, AuthProvider
클래스에서 getToken
메서드를 업데이트합니다.
const axios = require('axios');
class AuthProvider {
//...
getToken(scopes) {
return async function (req, res, next) {
const msalInstance = authProvider.getMsalInstance(authProvider.config.msalConfig);
try {
msalInstance.getTokenCache().deserialize(req.session.tokenCache);
const silentRequest = {
account: req.session.account,
scopes: scopes,
};
const tokenResponse = await msalInstance.acquireTokenSilent(silentRequest);
req.session.tokenCache = msalInstance.getTokenCache().serialize();
req.session.accessToken = tokenResponse.accessToken;
next();
} catch (error) {
if (error instanceof msal.InteractionRequiredAuthError) {
req.session.csrfToken = authProvider.cryptoProvider.createNewGuid();
const state = authProvider.cryptoProvider.base64Encode(
JSON.stringify({
redirectTo: 'http://localhost:3000/todos',
csrfToken: req.session.csrfToken,
})
);
const authCodeUrlRequestParams = {
state: state,
scopes: scopes,
};
const authCodeRequestParams = {
state: state,
scopes: scopes,
};
authProvider.redirectToAuthCodeUrl(
req,
res,
next,
authCodeUrlRequestParams,
authCodeRequestParams,
msalInstance
);
}
next(error);
}
};
}
//...
}
먼저 함수는 사용자에게 자격 증명을 묻는 메시지를 표시하지 않고 자동으로 액세스 토큰을 획득하려고 시도합니다.
const silentRequest = { account: req.session.account, scopes: scopes, }; const tokenResponse = await msalInstance.acquireTokenSilent(silentRequest);
토큰을 자동으로 획득하는 경우 세션에 저장합니다. API를 호출할 때 세션에서 토큰을 검색합니다.
req.session.accessToken = tokenResponse.accessToken;
토큰을 자동으로 획득하지 못하는 경우(예:
InteractionRequiredAuthError
예외) 액세스 토큰을 새로 요청합니다.
참고 항목
클라이언트 애플리케이션이 액세스 토큰을 받으면 이를 불투명 문자열로 처리해야 합니다. 액세스 토큰은 클라이언트 애플리케이션이 아닌 API를 위한 것입니다. 따라서 클라이언트 애플리케이션은 액세스 토큰을 읽거나 처리하려고 시도해서는 안 됩니다. 대신 API에 대한 요청의 Authorization 헤더에 있는 그대로 액세스 토큰을 포함해야 합니다. API는 액세스 토큰을 해석하고 이를 사용하여 클라이언트 애플리케이션의 요청을 인증하고 권한을 부여합니다.