Criar e autenticar usuários - Kotlin
Nesta página
- Usuários do App Services
- Pré-requisitos
- Registrar e criar uma nova conta de usuário
- Conectar um usuário
- Anônimo
- E-mail/senha
- JWT personalizado
- Chave API
- Função personalizada
- Apple
- Recuperar usuário atual
- Faça login off-line
- Gerenciar tokens de usuário
- Obtenha um token de acesso do usuário
- Configurar expiração do token de atualização
- Desconectar um usuário
- Observar alterações de autenticação
Para acessar o Atlas App Services, você deve primeiro autenticar um usuário com um provedor de autenticação do App Services . Esta página descreve como autenticar usuários do App Services App com o Realm Kotlin SDK. Consulte Authenticate & Manage Users (Autenticar Gerenciar usuários) na documentação do App Services para obter mais informações.
Importante
Requisitos de exclusão de conta do Google e Apple
Google e Apple exigem que os aplicativos listados em suas respectivas App Stores forneçam a qualquer usuário que crie uma conta a opção de excluí-la. Se você usa um método de autenticação em que deve registrar manualmente um usuário, como autenticação de e-mail/senha, ou um que cria automaticamente um usuário, como Sign-In with Apple, você deve implementar a exclusão da conta do usuário.
Usuários do App Services
O Atlas App Services fornece os seguintes provedores de autenticação integrados para conectar e desconectar usuários de um aplicativo cliente:
Usuários anônimos
Combinações de e-mail/senha
Chaves de API
OAuth 2.0 pelo Facebook, Google e Apple ID
JWT personalizado
Função personalizada
Após o login bem-sucedido, o Atlas App Services inicia uma sessão de usuário para o usuário. Atlas App Services gerenciam sessões com tokens de acesso e tokens de atualização, e o Kotlin SDK fornece a lógica para gerenciar tokens e fornecer solicitações. Para mais informações sobre gerenciar sessões de usuário e tokens, consulte Sessões de Usuário na documentação do Atlas App Services .
Depois de ter um usuário conectado, você pode:
Abrir um realm sincronizado com o objeto de configuração do usuário
Executar uma função de backend como o usuário conectado
Desconectar o usuário (consulte a seção Desconectar o usuário)
Você também pode registrar vários usuários em um aplicativo simultaneamente em um único dispositivo. Consulte Gerenciar aplicativos de vários usuários - Kotlin SDK para obter mais informações.
Pré-requisitos
Para autenticar usuários por meio do Atlas App Services, você deve ter um App Services App com um ou mais fornecedores de autenticação habilitados.
Para configurar um aplicativo App Services com provedores de autenticação, faça o seguinte:
Habilitar e configurar provedores de autenticação na documentação do App Services
Dica
Você pode habilitar vários fornecedores de autenticação. Se um usuário se autenticar usando mais de um método, é possível vincular as identidades de usuário de cada método a uma única conta de usuário.
Registrar e criar uma nova conta de usuário
O Atlas App Services registra um usuário de forma diferente, dependendo do provedor de autenticação:
Se você estiver usando a autenticação por e-mail/senha, os usuários devem primeiro se registrar e confirmar seu e-mail e senha antes de poderem se autenticar.
Se você estiver usando o Google, Facebook, Apple ou Custom JWT, o registro será tratado por esses serviços de terceiros.
Se você estiver usando a autenticação anônima, não precisará se registrar. Usuários anônimos não exigem registro.
Na primeira vez em que o usuário se autentica com sucesso no seu aplicativo, o Atlas App Services cria automaticamente um objeto de usuário, que contém um identificador exclusivo e metadados de usuário específicos do provedor. Para saber mais sobre o objeto de usuário que os App Services fornecem ao Kotlin SDK, consulte Ler Metadados do Usuário na documentação dos App Services.
Conectar um usuário
Para autenticar e conectar usuários em seu aplicativo, primeiro instancie um objeto Credenciais que contém as credenciais associadas ao fornecedor de autenticação e, em seguida, passe-o para app.login(). Cada provedor de autenticação corresponde a um método auxiliar estático usado para instanciar objetos Credentials
para esse provedor de autenticação.
// Instantiate your App Services App val app = App.create(YOUR_APP_ID) // Replace this with your App ID runBlocking { // Log in the user with the credentials associated // with the authentication provider // If successful, returns an authenticated `User` object val user = app.login(credentials) // ... work with the user ... }
Se for bem-sucedido, app.login()
retornará um objeto User
. No evento de falha, app.login()
lança uma exceção do tipo AppException
.
Dica
Você pode obter o tipo de provedor de autenticação usado para fazer login em um usuário por meio da propriedade user.provider. Se o usuário estiver desconectado, será retornado o provedor mais recente usado para fazer o login do usuário.
Anônimo
A autenticação anônima permite que os usuários conectem-se ao seu aplicativo com contas de curto prazo que não armazenam informações pessoais persistentes. Isso pode ser usado para permitir que os usuários experimentem o aplicativo antes de criarem uma conta ou durante o desenvolvimento e o teste do aplicativo. Usuários anônimos não exigem log. Consulte Autenticação anônima na documentação do App Services para obter mais informações.
Para fazer login com autenticação anônima, crie uma credencial anônima chamando Credentials.anonymous(), e depois passe a credencial gerada para app.login():
val app: App = App.create(YOUR_APP_ID) // Replace this with your App ID runBlocking { val anonymousCredentials = Credentials.anonymous() val user = app.login(anonymousCredentials) }
Por padrão, o Kotlin SDK reutiliza o mesmo usuário anônimo se esse usuário não tiver feito logout. Se você deseja criar mais de um usuário anônimo, configure o reuseExisting = false
ao registrar com credenciais anônimas adicionais:
// Logs in with an anonymous user val anonUser = app.login(Credentials.anonymous()) // Logs in with a new, different anonymous user val otherAnonUser = app.login(Credentials.anonymous(reuseExisting = false))
E-mail/senha
O provedor de autenticação por e-mail/senha permite que os usuários se conectem ao seu aplicativo com um nome de usuário e uma senha de e-mail. Consulte Autenticação por e-mail/senha na documentação do App Services para obter mais informações.
Importante
Usuários de e-mail/senha exigem registro
A autenticação de email/senha requer que você se registre e confirme o email e a senha fornecidos pelo usuário antes que o usuário possa se autenticar em um Aplicativo do App Services. Saiba como registrar usuários de e-mail/senha.
Para fazer login com a autenticação de e-mail/senha, crie uma credencial de e-mail/senha chamando Crereditals.emailPassword() com o e-mail e senha registrados do usuário e, em seguida, passar a credencial gerada para app.login():
val app: App = App.create(YOUR_APP_ID) // Replace this with your App ID runBlocking { val emailPasswordCredentials = Credentials.emailPassword(email, password) val user = app.login(emailPasswordCredentials) }
JWT personalizado
O fornecedor de autenticação de token JSON web personalizado permite que os usuários façam login em seu aplicativo com um token web JSON personalizado ( JSON web token JSON web). O registro para autenticação de JSON web token é tratado pelo fornecedor de JSON web token. Consulte Autenticação de token da web JSON personalizado na documentação do Atlas App Services para obter mais informações.
Para fazer login com autenticação JWT, crie uma credencial JWT chamando Credentials.jwt() com o JWT do usuário e, em seguida, passe a credencial gerada para app.login():
val app: App = App.create(YOUR_APP_ID) // Replace this with your App ID runBlocking { // Registration is handled by the JWT provider val jwtCredentials = Credentials.jwt(jwtToken) val user = app.login(jwtCredentials) }
Chave API
O provedor de autenticação de chave API permite que usuários não anônimos autenticados façam login em seu aplicativo com uma chave API. Consulte Autenticação de Chave deAPI na documentação do Atlas App Services para obter mais informações.
Para fazer login com autenticação de chave API, crie uma credencial de chave API chamando Crereditals.apiKey() com a chave API do usuário e, em seguida, passar a credencial gerada para app.login():
val app: App = App.create(YOUR_APP_ID) // Replace this with your App ID runBlocking { val user = app.login(Credentials.apiKey(key)) }
As chaves API do usuário são geradas automaticamente e gerenciadas pelo Kotlin SDK. Aprenda a Manage User API Keys - Kotlin SDK.
Função personalizada
O fornecedor de autenticação de Função Personalizada permite aos utilizadores iniciarem sessão na sua aplicação utilizando lógica de autenticação personalizada gerida por uma Atlas Function. Consulte a Autenticação de função personalizada na documentação do Atlas App Services para obter mais informações.
Para fazer login com a autenticação de Função Personalizada, passe seus argumentos personalizados como uma carga para Credentials.customFunction(), e depois passe a credencial gerada para app.login():
// Create custom arguments for your Atlas Function val customCredentials = Credentials.customFunction( payload = mapOf("username" to "bob") ) val user = app.login(customCredentials)
Saiba como Chamar uma função do Atlas - Kotlin SDK.
Novidades na versão 1.9.0.
Você pode serializar dados para uma credencial de Função Personalizada usando um codificador EJSON. Para mais informações, incluindo exemplos, consulte Codificação JSON para Atlas.
O provedor de autenticação do Google permite que você autentique usuários por meio de sua Conta do Google existente usando um token OAuth 2.0 . Consulte Autenticação do Google na documentação do Atlas App Services para obter mais informações.
Antes de autenticar usuários com o Google, você deve configurar seu aplicativo para autenticação de usuário do Google:
No console do Google Cloud Platform, crie um OAuth 2.0 ID do cliente do tipo "aplicativo Web".
Configure seu aplicativo de backend para usar esse ID de cliente e o segredo de cliente associado.
Habilite o OpenID Connect no backend.
Use o login oficial do Google para Android para autenticar usuários do Google em seu aplicativo Android. O seguinte código implementa esse fluxo, começando com uma chamada de método para loginWithGoogle()
:
fun loginWithGoogle() { val gso = GoogleSignInOptions .Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken("YOUR WEB APPLICATION CLIENT ID FOR GOOGLE AUTH") .build() val googleSignInClient = GoogleSignIn.getClient(activity, gso) val signInIntent: Intent = googleSignInClient.signInIntent val resultLauncher: ActivityResultLauncher<Intent> = // Note: this activity MUST inherit from ComponentActivity or AppCompatActivity to use this API registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> val task: Task<GoogleSignInAccount> = GoogleSignIn.getSignedInAccountFromIntent(result.data) handleSignInResult(task) } resultLauncher.launch(signInIntent) } fun handleSignInResult(completedTask: Task<GoogleSignInAccount>) { try { if (completedTask.isSuccessful) { val account: GoogleSignInAccount? = completedTask.getResult(ApiException::class.java) val token: String = account?.idToken!! val app: App = App.create(YOUR_APP_ID) // Replace this with your App ID runBlocking { val user = app.login(Credentials.google(token, GoogleAuthType.ID_TOKEN)) } } else { Log.e("AUTH", "Google Auth failed: ${completedTask.exception}") } } catch (e: ApiException) { Log.e("AUTH", "Failed to authenticate using Google OAuth: " + e.message); } }
Dica
Para saber mais sobre o Google Sign-In para Android, confira o Guia de Integração oficial do Google Sign-In para Android.
O Kotlin Multiplatform (KMP) suporta muitos ambientes, mas este exemplo mostra o login na plataforma Android. Para obter informações sobre como fazer login em uma conta do Google em plataformas Apple, consulte o Exemplo de Swift SDK.
O provedor de autenticação do Facebook permite que você autentique usuários por meio de um aplicativo do Facebook usando sua conta existente do Facebook. Consulte Facebook Authentication na documentação dos App Services para obter mais informações.
Antes de autenticar usuários com o Facebook, você deve configurar o fluxo de autenticação para seu aplicativo seguindo o início rápido oficial do Facebook para Android.
No manipulador de conclusão de login, obtenha o token de acesso do usuário conectado a partir do Facebook LoginResult. Use o token de acesso para criar uma credencial do Facebook chamando Credentials.facebook() com o token de acesso do usuário e depois passar a credencial gerada para app.login():
val app: App = App.create(YOUR_APP_ID) // Replace this with your App ID FacebookSdk.setApplicationId(YOUR_FACEBOOK_SDK_APP_ID) FacebookSdk.sdkInitialize(activity) val callbackManager = CallbackManager.Factory.create() LoginManager.getInstance().registerCallback( callbackManager, object : FacebookCallback<LoginResult> { override fun onSuccess(loginResult: LoginResult) { // Signed in successfully, forward credentials to MongoDB Realm. val accessToken = loginResult.accessToken runBlocking { val user = app.login(Credentials.facebook(accessToken.token)) } } override fun onCancel() { Log.v("AUTH", "Cancelled Facebook login") } override fun onError(exception: FacebookException) { Log.e("AUTH", "Failed to authenticate with Facebook: ${exception.message}") } })
Importante
Não armazene URLs de fotos de perfil do Facebook
Os URLs da imagem de perfil do Facebook incluem o token de acesso do usuário para conceder permissão à imagem. Para garantir a segurança, não armazene um URL que inclua um token de acesso do usuário. Em vez disso, acesse o URL diretamente dos campos de metadados do usuário quando precisar buscar a imagem.
O Kotlin Multiplatform (KMP) suporta muitos ambientes, mas este exemplo mostra o login na plataforma Android. Para obter informações sobre como entrar em uma conta do Facebook em plataformas da Apple, consulte o Exemplo de Swift SDK.
Apple
O acesso com o provedor de autenticação da Apple permite que os usuários se conectem em seu aplicativo com um token personalizado fornecido pela Apple. Consulte Autenticação do ID Apple na documentação do App Services para obter mais informações.
Para fazer login com a autenticação da Apple, crie uma credencial da Apple chamando Credentials.apple () com o token do usuário e, em seguida, passe a credencial gerada para app.login():
val app: App = App.create(YOUR_APP_ID) // Replace this with your App ID runBlocking { // Registration is handled by Apple val appleCredentials = Credentials.apple(idToken) val user = app.login(appleCredentials) }
O Kotlin Multiplatform (KMP) suporta muitos ambientes, mas este exemplo mostra o login na plataforma Android. Para obter informações sobre como fazer login com a Apple em plataformas Apple, consulte o Exemplo de Swift SDK.
Recuperar usuário atual
Você pode recuperar o usuário conectado atualmente com a propriedade App.currentUser:
val user = app.currentUser
Se você tiver vários usuários conectados ao seu aplicativo, isso retornará o último usuário válido que fez logon ou retornará null
se não houver usuários conectados. Consulte Gerenciar aplicativos de vários usuários - Kotlin SDK para obter mais informações.
Observe que o objeto currentUser
é persistente no armazenamento local, portanto, mesmo que o aplicativo seja desligado após a autenticação inicial, você não precisará chamá-lo logIn
novamente (a menos que o usuário tenha feito logout ou a sessão do usuário tenha expirado).
Use esse método para conectar offline ou chamar uma função do Atlas quando o aplicativo for aberto posteriormente.
Faça login off-line
Quando seu aplicativo Realm autentica um usuário, armazena em cache as credenciais do usuário. Você pode verificar as credenciais de usuário existentes para ignorar o fluxo de login e acessar o usuário em cache. Use isto para abrir um realm offline.
Observação
O login inicial exige uma conexão de rede
Quando um usuário se inscreve em seu aplicativo ou faz login pela primeira vez com uma conta existente em um cliente, o cliente deve ter uma conexão de rede. A verificação de credenciais de usuário em cache permite que você abra um domínio offline, mas somente se o usuário já tiver feito login enquanto estiver online.
// You can only open a synced realm offline if there is a cached user credential. If // there is no app.currentUser, you must log them in, which requires a network connection. if (app.currentUser == null) { app.login(Credentials.emailPassword(email, password)) } // If the app.currentUser isn't null, you can use the cached credential to open the synced // realm even if the user is offline. val user = app.currentUser!! val realm = Realm.open(config) // Query the realm we opened, and see that it contains data val offlineToads: RealmResults<Toad> = realm.query<Toad>().find() Log.v("After opening a realm offline, offlineToads.size is ${offlineToads.size}") realm.close()
Gerenciar tokens de usuário
O Realm Kotlin SDK gerencia automaticamente os tokens de acesso, atualiza-os quando expiram e inclui um token de acesso válido para o usuário atual em cada solicitação. Os tokens são removidos após o usuário sair.
Importante
O Realm só atualiza o token de acesso de um usuário. O Realm não atualiza automaticamente o token de atualização. Quando o token de atualização expira, o SDK não pode mais obter um token de acesso atualizado e o dispositivo não pode sincronizar até que o usuário faça logon novamente.
Para mais informações sobre o acesso à sessão do usuário e os tokens de atualização, consulte Sessões do usuário na documentação do App Services.
Obtenha um token de acesso do usuário
Você pode obter o token de acesso atual para um usuário conectado com a propriedade user.accessToken:
val token = user.accessToken
Se você enviar solicitações fora do SDK, deverá incluir o token de acesso do usuário em cada solicitação e atualizar manualmente o token quando ele expirar. Os tokens de acesso expiram 30 minutos após o usuário fazer login.
Você pode obter o token de atualização atual para um usuário conectado com o user.refreshToken que você pode usar para solicitar um novo token de acesso:
// Gets the current refresh token for the user fun getRefreshToken(): String { return user.refreshToken }
Configurar expiração do token de atualização
A atualização dos tokens expira após um período de tempo definido. Quando o token de atualização expira, o token de acesso não pode mais ser atualizado e o usuário deve se conectar novamente.
Se o token de atualização expirar após a abertura do domínio, o dispositivo não poderá sincronizar até que o usuário faça login novamente. Seu manipulador de erros de sincronização deve implementar uma lógica que capture um erro de token expirado ao tentar sincronizar e, em seguida, redirecionar os usuários para um fluxo de login.
Para obter informações sobre como configurar a expiração do token de atualização, consulte Gerencie sessões de usuário na documentação do App Services.
Desconectar um usuário
Aviso
Se o usuário se desconectar, você não poderá mais ler ou gravar dados em nenhum domínio sincronizado que o usuário tenha aberto. Consequentemente, qualquer operação que ainda não tenha sido concluída antes de o usuário iniciar o logout não poderá ser concluída com êxito e provavelmente resultará em erro. Todos os dados de uma operação de gravação que falhar dessa forma serão perdidos.
Você pode desconectar qualquer usuário, independentemente do fornecedor de autenticação usado para o registro, usando user.logOut():
val app: App = App.create(YOUR_APP_ID) // Replace this with your App ID runBlocking { val user = app.login(credentials) // ... work with logged-in user ... // Ensure all local updates are uploaded // before logging out user.logOut() }
O método user.logOut()
:
Exclui credenciais de usuário armazenadas localmente do dispositivo.
Interrompe imediatamente qualquer sincronização de e para os realms do usuário.
Para usuários anônimos, remove o usuário.
Como o encerramento da sessão interrompe a sincronização, você só deve sair depois que todas as atualizações locais do Realm tiverem sido enviadas para o servidor.
Observar alterações de autenticação
Novidades na versão 10.8.0.
Você pode observar um fluxo de eventos de alteração de autenticação chamando App.authenticationChangeAsFlow() . Esse fluxo emite eventos de AuthenticationChange de três estados possíveis, representados como subclasses:
LoggedIn
: Um usuário faz login no aplicativo.LoggedOut
: Um usuário sai do aplicativo.Removed
: Um usuário é removido do aplicativo, o que também o desconecta.
Estes eventos contêm uma propriedade user
que fornece uma referência ao objeto User
que foi logado, desconectado ou removido.
// Create a Flow of AuthenticationChange objects app.authenticationChangeAsFlow().collect { change: AuthenticationChange -> when (change) { is LoggedIn -> proceedToAppActivity(change.user) is LoggedOut -> proceedToLoginActivity(change.user) is Removed -> proceedToRemovedUserActivity(change.user) } }