사용자 인증 - React Native SDK
이 페이지의 내용
@realm/react
사용자 인증 을 위한 후크가 있습니다. useAuth 및 useEmailPasswordAuth 는 활성화 인증 제공자를 사용하여 인증 을 처리하다 합니다.
빠른 useAuth
참조는 이 페이지의 useAuth 후크 를 참조하세요. 빠른 useEmailPasswordAuth
참조는 이메일/비밀번호 사용자 관리 페이지의 useEmailPasswordAuth 후크 를 참조하세요.
Realm.js API를 직접 사용할 수도 있습니다. 자격 증명 객체를 인스턴스화하고 이를 App.logIn() 에 전달하여 사용자 객체를 인증하고 가져옵니다.
전제 조건
사용자를 인증하기 전에 먼저 다음을 수행해야 합니다.
앱에서 하나 이상의 인증 제공자를 활성화합니다.
클라이언트에서 사용자 인증 구성하기
@realm/react
에는 사용자 인증을 위한 providers와 hooks이 있습니다. 사용자 인증을 구성하려면 다음을 실행하세요.
@realm/react
providers를 설정합니다.UserProvider
에 대한 폴백 컴포넌트를 작성합니다.
@realm/react Providers 설정하기
AppProvider 에 의해 래핑된 컴포넌트는 useApp 및 useAuth 후크에 액세스할 수 있습니다. 이러한 구성 요소는 AppProvider
가 Atlas App Services 백엔드에 성공적으로 연결된 경우에만 렌더링됩니다.
UserProvider 에 의해 래핑된 컴포넌트는 useUser 훅을 사용하여 인증된 사용자에게 액세스할 수 있습니다. 이러한 구성 요소는 앱에 인증된 사용자가 있는 경우에만 렌더링됩니다.
사용자 인증을 구성하려면 다음을 실행하세요.
App Services에 액세스해야 하는 모든 컴포넌트를
AppProvider
로 래핑하세요.AppProvider
내에서 인증된 사용자가 액세스할 수 있도록 하려는 모든 컴포넌트를UserProvider
로 래핑합니다.UserProvider
에 사용자를 로그인하는 컴포넌트가 있는fallback
속성을 포함하세요. 인증된 사용자가 없는 경우 앱은 이 컴포넌트를 렌더링합니다.
import React from 'react'; import {AppProvider, UserProvider} from '@realm/react'; // Fallback log in component that's defined in another file. import {LogIn} from './Login'; export const LoginExample = () => { return ( <ScrollView> <AppProvider id={APP_ID}> {/* If there is no authenticated user, mount the `fallback` component. When user successfully authenticates, the app unmounts the `fallback` component (in this case, the `LogIn` component). */} <UserProvider fallback={LogIn}> {/* Components inside UserProvider have access to the user. These components only mount if there's an authenticated user. */} <UserInformation /> </UserProvider> </AppProvider> </ScrollView> ); };
UserProvider에 대한 폴백 컴포넌트 작성하기
만약 앱에 인증되고 로그인한 사용자가 없다면 UserProvider
및 해당 하위 컴포넌트는 렌더링되지 않습니다. 이 경우를 처리하려면 폴백 컴포넌트를 UserProvider
에 전달할 수 있습니다. 이는 일반적으로 앱의 로그인 화면입니다.
다음 예에서는 익명 인증을 사용하지만, useAuth
메서드 중 하나를 사용할 수 있습니다.
UserProvider
에 대한 인증 폴백 컴포넌트를 작성하려면 다음을 수행하세요.
함수형 컴포넌트를 만듭니다.
logInWithAnonymous
과result
을useAuth
hook에서 구조 분해하세요.빈 종속성 배열을 가진
useEffect
블록 내에서logInWithAnonymous()
를 호출합니다.result
를 처리합니다. 인증 작업이 성공하지 못한 경우result
를 기반으로 에러 핸들링을 합니다.
export const LogIn = () => { // `logInWithAnonymous` logs in a user using an // anonymous Realm Credential. // `result` gives us access to the result of the // current operation. In this case, `logInWithAnonymous`. const {logInWithAnonymous, result} = useAuth(); // Log in an anyonmous user on component render. // On successful login, this fallback component unmounts. useEffect(() => { logInWithAnonymous(); }, []) return ( <View > {!result.error && <Text>Please log in</Text>} <View> {result.pending && <ActivityIndicator />} {result.error && <ErrorComponent error={result.error} />} </View> </View> ); };
사용자 세션
React Native SDK는 Atlas App Services와 통신하여 액세스 토큰과 새로 고침 토큰으로 세션을 관리합니다.
세션 관리에 대해 자세히 알아보려면 App Services 문서에서 사용자 세션을 참조하세요.
인증 제공자 및 클라이언트 인증
클라이언트에서 사용자 인증을 구성하고 App Services App에서 인증 제공자를 구성한 후 사용자를 로그인할 수 있습니다.
익명의 사용자
익명 제공자를 사용하면 사용자가 관련 정보가 없는 임시 계정으로 애플리케이션에 로그인할 수 있습니다.
현재 로그인한 사용자가 있을 때 인증 방법을 호출하면 현재 사용자가 새 사용자로 전환됩니다.
UserProvider
의 폴백에서 logInWithAnonymous()
를 호출하면 익명 로그인이 성공하자마자 UserProvider
의 하위 컴포넌트가 렌더링됩니다.
익명 사용자로 로그인하려면:
logInWithAnonymous
과result
을useAuth
hook에서 구조 분해하세요.인수 없이
logInWithAnonymous()
를 호출합니다.result
을 처리합니다.
export const LogInWithAnonymous = () => { const {logInWithAnonymous, result} = useAuth(); const performAnonymousLogin = logInWithAnonymous; // Handle `result`... };
이메일/비밀번호 사용자
이메일/비밀번호 인증 제공자를 통해 사용자는 이메일 주소와 비밀번호를 사용하여 애플리케이션에 로그인할 수 있습니다.
useEmailPasswordAuth
후크를 사용하여 클라이언트의 사용자 로그인을 처리할 수 있습니다. useEmailPasswordAuth
에 대한 간단한 안내는 Manage Email/Password Users 페이지의 useEmailPasswordAuth 후크를 참조하세요.
이메일과 비밀번호로 사용자를 로그인하려면 다음을 수행하세요.
logIn
과result
을useEmailPasswordAuth
hook에서 구조 분해하세요.사용자의 이메일과 비밀번호를
LogIn()
에 객체로서 전달합니다.result
을 처리합니다.
export const LoginWithEmail = () => { const {logIn, result} = useEmailPasswordAuth(); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const performLogin = () => { logIn({email, password}); }; // Handle `result`... };
API 키 사용자
API 키 인증 제공자를 사용하면 서버 프로세스가 직접 또는 사용자를 대신하여 앱에 액세스할 수 있습니다.
API 키로 사용자를 로그 하려면 먼저 API 키를 API 해야 합니다.
API 키로 로그인 하려면 다음을 수행합니다.
loginWithApiKey
과result
을useAuth
hook에서 구조 분해하세요.API 키를
loginWithApiKey()
에 전달합니다.
const loginApiKeyUser = async (apiKey: ApiKey) => { try { logInWithApiKey(apiKey!.key); } catch (error) { console.log(error); } };
사용자 지정 JWT 사용자
사용자 지정 JSON web token 인증 제공자는 JSON web token 을 반환하는 모든 인증 시스템을 사용하여 사용자 인증을 처리합니다.
사용자 정의 JWT 사용자로 로그인하려면:
App Services 백엔드에서 JWT 인증 제공자를 설정합니다.
외부 시스템에서 JWT를 가져옵니다.
logInWithJWT
과result
을useAuth
hook에서 구조 분해하세요.JWT를
logInWithJWT()
에 전달합니다.result
을 처리합니다.
export const LogInWithJWT = () => { const {logInWithJWT, result} = useAuth(); // Get the current anonymous user so we can call // an App Services Function later. const anonymousUser = useUser(); const performJWTLogin = async () => { // Get a JWT from a provider. In this case, from // an App Services Function called "generateJWT". const token = (await anonymousUser.functions.generateJWT()) as string; logInWithJWT(token); }; // Handle `result`... };
사용자 지정 기능 사용자
사용자 정의 함수 인증 제공자는 사용자 임의의 정보를 페이로드로 받는 함수를 실행하여 사용자 인증을 처리할 수 있게 해줍니다. 자세한 내용은 사용자 정의 함수 인증을 참조하세요.
사용자 지정 함수 제공자를 사용해 사용자를 로그인하려면:
인증 요구 사항을 처리하는 App Services 함수를 만듭니다.
App Services App에 대해 사용자 지정 함수 제공자를 사용하도록 설정하고 전 단계에서 만든 함수를 사용하도록 구성합니다.
logInWithFunction
과result
을useAuth
hook에서 구조 분해하세요.유저네임과 같은 사용자 데이터를
logInWithFunction()
에 전달합니다.result
을 처리합니다.
export const LogInWithFunction = () => { const {logInWithFunction, result} = useAuth(); const performFunctionLogin = async (email: string, password: string) => { // Pass arbitrary information to the Atlas function configured // for your App's Custom Function provider. logInWithFunction({email, password}); }; // Handle `result`... };
Facebook 사용자
Facebook 인증 제공자를 사용하면 기존 Facebook 계정을 사용하여 Facebook 앱을 통해 사용자를 인증할 수 있습니다.
기존 Facebook 계정으로 사용자를 로그인하려면 App Services App에 대한 Facebook 인증 제공자를 구성하고 활성화해야 합니다.
중요
Facebook 프로필 사진 URL 저장 안 함
Facebook 프로필 사진 URL에는 이미지 권한을 부여하는 사용자의 액세스 토큰이 포함되어 있습니다. 보안을 위해 사용자의 액세스 토큰이 포함된 URL을 저장하지 마세요. 대신 이미지를 가져와야 할 때 사용자의 메타데이터 필드에서 직접 URL에 액세스합니다.
공식 Facebook SDK 를 사용할 수 있습니다. 사용자 인증 을 처리하다 하고 클라이언트 애플리케이션 에서 흐름을 리디렉션합니다. 인증이 완료되면 Facebook SDK는 액세스 토큰을 반환하며, 이 토큰을 React Native 앱 으로 전송하여 앱 에서 사용자 로그인을 완료할 수 있습니다.
export const LogInWithFacebook = () => { const {logInWithFacebook, result} = useAuth(); const performLogin = () => { // Get an access token using the Facebook SDK. // You must define this function. const token = getFacebookToken(); logInWithFacebook(token); }; // Handle `result`... };
Google 사용자
Google 인증 제공자를 사용하면 기존 Google 계정으로 사용자를 인증할 수 있습니다.
Google 사용자를 인증하려면 App Services App에 대한 Google 인증 제공자를 구성해야 합니다.
React Native를 위한 공식 Google Sign in With Google(Google로 로그인) 통합은 없습니다. Realm 인증을 사용하여 Google로 로그인을 React Native 앱에 통합하는 가장 간단한 방법은 타사 라이브러리를 사용하는 것입니다. Google Identity Services 를 사용하여 자체 솔루션을 구축할 수도 있습니다. 사용자 인증을 처리하고 클라이언트 애플리케이션에서 흐름을 리디렉션합니다.
어떤 방식으로 구현하든 Google 인증 서버에서 ID 토큰을 가져와야 합니다. 해당 ID 토큰을 사용하여 Realm에 로그인합니다.
export const LogInWithGoogle = () => { const {logInWithGoogle, result} = useAuth(); const performLogin = () => { // Get an access token using a third-party library // or build your own solution. You must define this function. const token = getGoogleToken(); logInWithGoogle(token); }; // Handle `result`... };
Apple 사용자
Apple 인증 제공자를 사용하면 Apple로 로그인을 통해 사용자를 인증할 수 있습니다.
Apple 사용자를 인증하려면 App Services App에 대한 Apple 인증 제공자를 구성해야 합니다.
공식 Sign in with Apple JavaScript SDK를 사용할 수 있습니다. 사용자 인증을 처리하고 클라이언트 애플리케이션에서 흐름을 리디렉션합니다. 인증이 완료되면 Apple JavaScript SDK가 ID 토큰을 반환하며, 이 토큰을 React Native 앱으로 전송하여 앱에서 사용자 로그인을 완료할 수 있습니다.
export const LogInWithApple = () => { const {logInWithApple, result} = useAuth(); const performLogin = () => { // Get an access token using the Apple SDK. // You must define this function. const token = getAppleToken(); logInWithApple(token); }; // Handle `result`... };
팁
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
객체에서 로그인한 사용자의 액세스 토큰에 액세스하고 새로 고칠 수 있습니다.
const RefreshUserAcessToken = () => { const user = useUser(); const [accessToken, setAccessToken] = useState<string | null>(); // Gets a valid user access token to authenticate requests const refreshAccessToken = async () => { // 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(); setAccessToken(user.accessToken); }; // Use access token... };
토큰 만료 새로 고침
새로 고침 토큰은 일정 시간이 지나면 만료됩니다. 새로 고침 토큰이 만료되면 액세스 토큰을 더 이상 새로 고칠 수 없으며 사용자는 다시 로그인해야 합니다.
영역이 열린 후 새로 고침 토큰이 만료되면 사용자가 다시 로그인할 때까지 장치를 동기화할 수 없습니다. 동기화 오류 처리기는 동기화를 시도할 때 토큰 만료 오류를 포착한 다음 사용자를 로그인 흐름으로 리디렉션하는 로직을 구현해야 합니다.
새로 고침 토큰 만료 구성에 대한 자세한 내용은 App Services 문서에서 사용자 세션 관리를 참조하세요.
사용자 로그아웃
사용자를 로그아웃하려면 해당 사용자 인스턴스에서 User.logOut()
을 호출합니다.
경고
사용자가 로그아웃하면 사용자가 연 동기화된 영역에서 더 이상 데이터를 읽거나 쓸 수 없습니다. 따라서 최초 사용자가 로그아웃하기 전에 아직 완료되지 않은 작업이 성공적으로 완료되지 않으며 오류가 발생할 수 있습니다. 이러한 방식으로 실패한 쓰기 작업의 모든 데이터는 손실됩니다.
function UserInformation() { const user = useUser(); const {logOut} = useAuth(); const performLogout = () => { logOut(); }; // Add UI for logging out... }
useAuth 후크 참조
useAuth
후크에는 모든 App Services 인증 제공자에 대한 인증 방법이 있습니다. 또한 인증과 관련된 상태(state)도 가지고 있습니다. 자세한 내용은 useAuth 참조 문서를 확인해주세요.
useAuth에 대한 @realm/react
API 문서를 확인할 수도 있습니다.