사용자 인증 - Node.js SDK
이 페이지의 내용
로그인
Realm은 허용된 인증 제공자를 통해 사용자를 앱에 인증하기 위한 API를 제공합니다. Credentials
객체를 인스턴스화하고 app.login()
메서드에 전달하여 사용자 로그인을 인증하고 User
객체를 생성합니다.
사용자 세션
Atlas App Services는 액세스 토큰 및 새로 고침 토큰으로 세션을 관리합니다. 클라이언트 SDK는 토큰 관리를 위한 로직을 제공하며 요청 시 토큰을 제공합니다.
익명의 사용자
익명 제공자를 사용하면 사용자가 관련 정보가 없는 임시 계정으로 애플리케이션에 로그인할 수 있습니다.
로그인하려면 익명의 자격 증명을 만들어 App.logIn()
에 전달합니다.
// Create an anonymous credential const credentials = Realm.Credentials.anonymous(); const user = await app.logIn(credentials);
// Create an anonymous credential const credentials = Realm.Credentials.anonymous(); const user = await app.logIn(credentials);
이메일/비밀번호 사용자
이메일/비밀번호 인증 제공자를 통해 사용자는 이메일 주소와 비밀번호를 사용하여 애플리케이션에 로그인할 수 있습니다.
로그인하려면 사용자의 이메일 주소와 비밀번호를 사용하여 이메일/비밀번호 자격 증명을 생성하고 App.logIn()
에 전달합니다.
// Create an email/password credential const credentials = Realm.Credentials.emailPassword( "someone@example.com", "Pa55w0rd!" ); const user = await app.logIn(credentials);
// Create an email/password credential const credentials = Realm.Credentials.emailPassword( "someone@example.com", "Pa55w0rd!" ); const user = await app.logIn(credentials);
API 키 사용자
API 키 인증 제공자를 사용하면 서버 프로세스가 직접 또는 사용자를 대신하여 앱에 액세스할 수 있습니다.
API 키로 로그인하려면 서버 또는 사용자 API 키로 API 키 자격 증명을 만들어 App.logIn()
에 전달합니다.
// Get the API key from the local environment const apiKey = process.env?.appServicesApiKey; if (!apiKey) { throw new Error("Could not find a Server API Key."); } // Create an api key credential const credentials = Realm.Credentials.apiKey(apiKey); const user = await app.logIn(credentials);
// Get the API key from the local environment. const apiKey = process.env?.appServicesApiKey; if (!apiKey) { throw new Error("Could not find a Server API Key."); } // Create an api key credential. const credentials = Realm.Credentials.apiKey(apiKey); const user = await app.logIn(credentials);
사용자 지정 JWT 사용자
사용자 지정 JSON web token 인증 제공자를 사용하면 JSON web token 을 반환하는 모든 인증 시스템에서 사용자 인증을 처리할 수 있습니다.
로그인하려면 외부 시스템에서 JWT를 사용하여 사용자 지정 JWT 자격 증명을 생성하고 이를 App.logIn()
에 전달합니다.
// Create a custom jwt credential const jwt = await authenticateWithExternalSystem(); const credentials = Realm.Credentials.jwt(jwt); const user = await app.logIn(credentials);
// Create a custom jwt credential. const jwt = await authenticateWithExternalSystem(); const credentials = Realm.Credentials.jwt(jwt); const user = await app.logIn(credentials);
사용자 지정 기능 사용자
사용자 지정 함수 인증 제공자 를 사용하면 사용자에 대한 임의의 정보 페이로드를 수신하는 함수 를 실행 하여 사용자 인증 을 처리하다 할 수 있습니다.
사용자 지정 함수 공급자로 로그인하려면 페이로드 객체를 사용하여 사용자 지정 함수 자격 증명을 생성하고 App.logIn()
에 전달합니다.
// Create a custom function credential const credentials = Realm.Credentials.function({ username: "ilovemongodb", }); const user = await app.logIn(credentials);
// Create a custom function credential. const credentials = Realm.Credentials.function({ username: "ilovemongodb", }); const user = await app.logIn(credentials);
Facebook 사용자
Facebook 인증 제공자를 사용하면 기존 Facebook 계정을 사용하여 Facebook 앱을 통해 사용자를 인증할 수 있습니다.
중요
Facebook 프로필 사진 URL 저장 안 함
Facebook 프로필 사진 URL에는 이미지 권한을 부여하는 사용자의 액세스 토큰이 포함되어 있습니다. 보안을 위해 사용자의 액세스 토큰이 포함된 URL을 저장하지 마세요. 대신 이미지를 가져와야 할 때 사용자의 메타데이터 필드에서 직접 URL에 액세스합니다.
공식 Facebook SDK 를 사용할 수 있습니다. 사용자 인증 을 처리하다 하고 클라이언트 애플리케이션 에서 흐름을 리디렉션합니다. 인증이 완료되면 Facebook SDK는 Node.js 앱 으로 전송하여 앱 에서 사용자 로그인을 완료하는 데 사용할 수 있는 액세스 토큰을 반환합니다.
// Get the access token from the Facebook SDK const { accessToken } = FB.getAuthResponse(); // Define credentials with the access token from the Facebook SDK const credentials = Realm.Credentials.facebook(accessToken); // Log the user in to your app await app.logIn(credentials);
Google 사용자
Google 인증 제공자를 사용하면 기존 Google 계정을 사용하여 Google 프로젝트를 통해 사용자를 인증할 수 있습니다.
참고
Google 인증 제공자 활성화
Google 사용자를 인증하려면 Google 인증 제공자를 구성해야 합니다. Node.js SDK에서 Google 인증 제공자를 사용하려면 OpenID Connect를 활성화해야 합니다.
앱 구성에서 Google 사용자 인증을 위해 앱을 설정하려면 다음과 같이 하세요:
Google Cloud Platform 콘솔 에서, OAuth 2 를 만듭니다.0 '웹 애플리케이션' 유형의 클라이언트 ID입니다.
해당 클라이언트 ID와 연결된 클라이언트 시크릿을 사용하도록 백엔드 앱을 구성합니다.
백엔드에서 OpenID Connect 활성화
공식 Google Auth Library for Node.js(Node.js용 Google 인증 라이브러리)를 통해 사용자 인증을 처리하고 Node.js 클라이언트 애플리케이션에서 인증 플로를 리디렉션합니다.
Realm 및 Google API npm 패키지를 설치합니다.
npm install realm googleapis 패키지를 프로젝트로 가져옵니다.
const Realm = require("realm"); const { google } = require("googleapis"); Google OAuth 2.0 클라이언트 및 Realm에 대한 구성을 만듭니다.
// Configure and instantiate Google OAuth2.0 client const oauthConfig = { client_id: GOOGLE_CLIENT_ID, project_id: GOOGLE_PROJECT_ID, auth_uri: "https://accounts.google.com/o/oauth2/auth", token_uri: "https://oauth2.googleapis.com/token", auth_provider_x509_cert_url: "https://www.googleapis.com/oauth2/v1/certs", client_secret: GOOGLE_CLIENT_SECRET, redirect_uris: [`${BASE_URL}/auth/google/callback`], JWTsecret: "secret", scopes: [ "https://www.googleapis.com/auth/userinfo.email", "https://www.googleapis.com/auth/userinfo.profile", "openid", // any other scopes you might require. View all here - https://developers.google.com/identity/protocols/oauth2/scopes ], }; const OAuth2 = google.auth.OAuth2; const oauth2Client = new OAuth2( oauthConfig.client_id, oauthConfig.client_secret, oauthConfig.redirect_uris[0] ); // Instantiate Realm app const realmApp = new Realm.App({ id: REALM_APP_ID, }); OAuth 로그인 링크를 생성하여 애플리케이션 클라이언트에 전달합니다.
// generate OAuth 2.0 log in link const loginLink = oauth2Client.generateAuthUrl({ access_type: "offline", // Indicates that we need to be able to access data continuously without the user constantly giving us consent scope: oauthConfig.scopes, }); Google OAuth 2.0 클라이언트의
getToken()
메서드를 사용하여 쿼리 문자열에 액세스 코드가 포함된 Google 인증 서버의 요청을 처리합니다. 콜백 함수에서id_token
을 사용하여 앱에 로그인합니다.// Get Google token and use it to sign into Realm oauth2Client.getToken(authCodeFromQueryString, async function ( error, token ) { if (error) return errorHandler(error); try { const credential = Realm.Credentials.google({ idToken: token.id_token, }); const user = await realmApp.logIn(credential); console.log("signed in as Realm user", user.id); } catch (error) { errorHandler(error); } });
예시
Node.js 서버에서 Google로 인증하기
예시 Node.js 서버 의 코드를 참조하세요. Sign in With Google을 구현합니다. 모든 Google OAuth 2.0 구현 은 server.js
파일 에 있습니다.
이 예시에서는 라우팅에 Express를 사용하고 Node.js용 Google 인증 라이브러리를 사용합니다.
사용자 인증 정보를 사용하여 Atlas Function을 호출하는 등 사용자를 대신하여 서버 측 작업을 수행하기 위해 Node.js 서버에서 Google을 통해 인증할 수 있습니다.
Apple 사용자
Apple 인증 제공자를 사용하면 Apple로 로그인을 통해 사용자를 인증할 수 있습니다.
공식 Sign in with Apple JavaScript SDK를 사용할 수 있습니다. 사용자 인증 을 처리하다 하고 클라이언트 애플리케이션 에서 흐름을 리디렉션합니다. 인증이 완료되면 Apple JavaScript SDK는 Node.js 앱 으로 전송하여 앱 에서 사용자 로그인을 완료하는 데 사용할 수 있는 ID 토큰을 반환합니다.
// Get the ID token from the Apple SDK const { id_token } = await AppleID.auth.signIn(); // Define credentials with the ID token from the Apple SDK const credentials = Realm.Credentials.apple(id_token); // Log the user in to your app const user = await app.logIn(credentials);
팁
token contains
an invalid number of segments
(이)라는 Login failed
오류가 발생하면 JWT의 UTF-8 인코딩 문자열 버전을 전달하고 있는지 확인하세요.
오프라인 로그인
Realm 애플리케이션이 사용자를 인증하면 사용자의 자격 증명을 캐시합니다. 기존 사용자 자격 증명을 확인하여 로그인 흐름을 우회하고 캐시된 사용자에 액세스할 수 있습니다. 이 기능을 사용하여 오프라인에서 영역을 열 수 있습니다.
참고
최초 로그인 시에는 네트워크 연결이 필요합니다.
사용자가 앱에 가입하거나 클라이언트의 기존 계정으로 처음으로 로그인하는 경우 클라이언트가 네트워크에 연결되어 있어야 합니다. 캐시된 사용자 자격 증명을 확인하면 오프라인에서 영역을 열 수 있지만 이는 사용자가 이전에 온라인 상태에서 로그인한 적이 있는 경우에만 가능합니다.
// Log user into your App Services App. // On first login, the user must have a network connection. const getUser = async () => { // If the device has no cached user credentials, log in. if (!app.currentUser) { const credentials = Realm.Credentials.anonymous(); await app.logIn(credentials); } // If the app is offline, but credentials are // cached, return existing user. return app.currentUser!; };
동기화 구성에서 캐시된 사용자를 사용하고 오프라인 상태에서 영역에 액세스하는 방법을 알아보려면 오프라인 상태에서 동기화된 Realm 열기 문서를 참조하세요.
사용자 액세스 토큰 받기
사용자가 로그인하면 Atlas App Services는 사용자에게 앱에 대한 액세스 권한을 부여하는 액세스 토큰을 생성합니다. Realm SDK는 액세스 토큰을 자동으로 관리하고 만료되면 갱신하며 각 요청마다 현재 사용자에 대한 유효한 액세스 토큰을 포함합니다. Realm은 새로 고침 토큰을 자동으로 갱신 하지 않습니다. 새로 고침 토큰이 만료되면 사용자는 다시 로그인해야 합니다.
SDK 외부로 요청을 보내는 경우 각 요청에 사용자의 액세스 토큰을 포함하고 토큰이 만료되면 수동으로 새로 고쳐야 합니다.
다음 예와 같이 SDK의 Realm.User
객체에서 로그인한 사용자의 액세스 토큰에 액세스하고 새로 고칠 수 있습니다.
// Gets a valid user access token to authenticate requests async function getValidAccessToken(user) { // An already logged in user's access token might be stale. To // guarantee that the token is valid, refresh it if necessary. await user.refreshCustomData(); return user.accessToken; }
// Gets a valid user access token to authenticate requests async function getValidAccessToken(user: Realm.User) { // An already logged in user's access token might be stale. To // guarantee that the token is valid, refresh it if necessary. await user.refreshCustomData(); return user.accessToken; }
토큰 만료 새로 고침
새로 고침 토큰은 일정 시간이 지나면 만료됩니다. 새로 고침 토큰이 만료되면 액세스 토큰을 더 이상 새로 고칠 수 없으며 사용자는 다시 로그인해야 합니다.
영역이 열린 후 새로 고침 토큰이 만료되면 사용자가 다시 로그인할 때까지 장치를 동기화할 수 없습니다. 동기화 오류 처리기는 동기화를 시도할 때 토큰 만료 오류를 포착한 다음 사용자를 로그인 흐름으로 리디렉션하는 로직을 구현해야 합니다.
새로 고침 토큰 만료 구성에 대한 자세한 내용은 App Services 문서에서 사용자 세션 관리를 참조하세요.
사용자 로그아웃
사용자를 로그아웃하려면 해당 사용자 인스턴스에서 User.logOut()
을(를) 호출합니다.
경고
사용자가 로그아웃하면 사용자가 연 동기화된 영역에서 더 이상 데이터를 읽거나 쓸 수 없습니다. 따라서 최초 사용자가 로그아웃하기 전에 아직 완료되지 않은 작업이 성공적으로 완료되지 않으며 오류가 발생할 수 있습니다. 이러한 방식으로 실패한 쓰기 작업의 모든 데이터는 손실됩니다.
// Log out the current user await app.currentUser?.logOut();