여러 사용자와 함께 작업 - 웹 SDK
개요
Realm SDK 를 사용하면 여러 사용자 가 특정 브라우저에서 동시에 앱 에 로그인할 수 있습니다. Realm 클라이언트 애플리케이션은 여러 사용자가 동시에 로그인한 경우에도 단일 활성 사용자의 컨텍스트에서 실행 됩니다. 다시 로그인 할 필요 없이 인증된 사용자 간에 빠르게 전환할 수 있습니다.
중요
로그인한 사용자는 재인증 없이 누구나 활성 사용자가 될 수 있습니다. 이는 앱에 따라 보안 취약성일 수 있습니다. 예를 들어, 공유 브라우저의 사용자는 자격 증명을 제공하거나 명시적인 권한을 요청하지 않고도 동료의 로그인 계정으로 전환할 수 있습니다. 애플리케이션에 더 엄격한 인증이 필요한 경우 사용자 간 전환을 피하고 다른 사용자를 인증하기 전에 활성 사용자를 명시적으로 로그아웃하는 것이 좋습니다.
사용자 계정 상태
사용자가 특정 브라우저에서 Realm SDK를 통해 처음 로그인하면 SDK는 사용자 정보를 저장하고 사용자의 상태를 추적합니다. 적극적으로 사용자를 제거하거나 브라우저에서 데이터를 삭제하지 않는 한, 사용자가 로그아웃하더라도 사용자의 데이터는 로컬 저장소에 남아 있습니다.
다음 상태는 지정된 시간에 추적된 사용자를 설명합니다.
인증됨: 브라우저에 로그인했지만 로그아웃하지 않았거나 세션이 취소되지 않은 모든 사용자입니다.
활성: 특정 브라우저에서 현재 앱을 사용 중인 인증된 단일 사용자입니다. SDK는 이 사용자를 발신 요청과 연결하고, Atlas App Services는 데이터 액세스 권한을 평가하고 이 사용자의 컨텍스트에서 함수를 실행합니다. 자세한 내용은 활성 사용자 를 참조하세요.
비활성: 현재 활성 사용자가 아닌 인증된 모든 사용자입니다. 언제든지 활성 사용자를 현재 비활성 사용자로 전환 할 수 있습니다.
로그아웃: 브라우저에서 인증했지만 이후 로그아웃했거나 세션이 취소된 모든 사용자입니다.
다음 다이어그램은 특정 이벤트가 발생할 때 Realm 클라이언트 앱 내의 사용자가 상태 간에 전환하는 방법을 보여줍니다.
장치에 신규 사용자 추가
Realm SDK 는 사용자가 해당 브라우저에 처음 로그인 할 때 브라우저의 로컬 저장 에 사용자 데이터를 자동으로 저장합니다. 사용자가 로그인하면 즉시 애플리케이션의 활성 사용자가 됩니다.
// Register Joe const joeEmail = "joe@example.com"; const joePassword = "passw0rd"; await app.emailPasswordAuth.registerUser({ email: joeEmail, password: joePassword, }); // Log in as Joe const joeCredentials = Realm.Credentials.emailPassword( joeEmail, joePassword ); const joe = await app.logIn(joeCredentials); // The active user is now Joe console.assert(joe.id === app.currentUser.id); // Register Emma const emmaEmail = "emma@example.com"; const emmaPassword = "passw0rd"; await app.emailPasswordAuth.registerUser({ email: emmaEmail, password: emmaPassword, }); // Log in as Emma const emmaCredentials = Realm.Credentials.emailPassword( emmaEmail, emmaPassword ); const emma = await app.logIn(emmaCredentials); // The active user is now Emma, but Joe is still logged in console.assert(emma.id === app.currentUser.id);
모든 장치 내 사용자 나열
브라우저와 연결된 모든 사용자 계정 목록에 액세스할 수 있습니다. 이 목록에는 현재 인증 여부에 관계없이 클라이언트 앱에 로그인한 모든 사용자가 포함됩니다.
// Get an object with all Users, where the keys are the User IDs for (const userId in app.allUsers) { const user = app.allUsers[userId]; console.log( `User with id ${user.id} is ${ user.isLoggedIn ? "logged in" : "logged out" }` ); }
활성 사용자 전환
언제든지 앱의 활성 사용자를 로그인된 다른 사용자로 빠르게 전환할 수 있습니다.
// Get some logged-in users const authenticatedUsers = Object.values(app.allUsers).filter( (user) => user.isLoggedIn ); const user1 = authenticatedUsers[0]; const user2 = authenticatedUsers[1]; // Switch to user1 app.switchUser(user1); // The active user is now user1 console.assert(app.currentUser.id === user1.id); // Switch to user2 app.switchUser(user2); // The active user is now user2 console.assert(app.currentUser.id === user2.id);
기기에서 사용자 제거
브라우저에서 사용자에 대한 모든 정보를 제거하고 사용자를 자동으로 로그아웃할 수 있습니다.
// Remove the current user from the device const user = app.currentUser; await app.removeUser(user); // The user is no longer the active user if (app.currentUser) { // The active user is now the logged in user (if there still is one) that was // most recently active console.assert(user.id !== app.currentUser.id); } // The user is no longer on the device console.assert( Object.values(app.allUsers).find(({ id }) => id === user.id) === undefined );