Se o seu app cliente do Firebase se comunicar com um servidor de back-end personalizado, poderá ser necessário identificar o usuário atualmente conectado no servidor. Para fazer isso de maneira segura, após o login, use HTTPS para enviar o token de ID do usuário para o servidor. Em seguida, no servidor, verifique a integridade e a autenticidade do token de ID e recupere o uid
dele. É possível usar o uid
transmitido
dessa maneira para identificar com segurança o usuário conectado ao servidor.
Antes de começar
Para verificar os tokens de ID com o SDK Admin do Firebase, você precisa ter uma conta de serviço. Siga as instruções de configuração do SDK Admin para saber mais sobre como inicializá-lo com uma conta de serviço.
Recuperar tokens de ID de clientes
Quando um usuário ou dispositivo faz login, o Firebase cria um token de ID correspondente que o identifica como único e concede a ele acesso a vários recursos, como o Firebase Realtime Database e o Cloud Storage. É possível reutilizar esse token de ID para identificar o usuário ou dispositivo no seu servidor de back-end personalizado. Para recuperar o token de ID do cliente, verifique se o usuário está conectado e, em seguida, acesse o token de ID dele:
iOS+
Objective-C
FIRUser *currentUser = [FIRAuth auth].currentUser;
[currentUser getIDTokenForcingRefresh:YES
completion:^(NSString *_Nullable idToken,
NSError *_Nullable error) {
if (error) {
// Handle error
return;
}
// Send token to your backend via HTTPS
// ...
}];
Swift
let currentUser = FIRAuth.auth()?.currentUser
currentUser?.getIDTokenForcingRefresh(true) { idToken, error in
if let error = error {
// Handle error
return;
}
// Send token to your backend via HTTPS
// ...
}
Android
FirebaseUser mUser = FirebaseAuth.getInstance().getCurrentUser();
mUser.getIdToken(true)
.addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
public void onComplete(@NonNull Task<GetTokenResult> task) {
if (task.isSuccessful()) {
String idToken = task.getResult().getToken();
// Send token to your backend via HTTPS
// ...
} else {
// Handle error -> task.getException();
}
}
});
Unity
Firebase.Auth.FirebaseUser user = auth.CurrentUser;
user.TokenAsync(true).ContinueWith(task => {
if (task.IsCanceled) {
Debug.LogError("TokenAsync was canceled.");
return;
}
if (task.IsFaulted) {
Debug.LogError("TokenAsync encountered an error: " + task.Exception);
return;
}
string idToken = task.Result;
// Send token to your backend via HTTPS
// ...
});
C++
firebase::auth::User user = auth->current_user();
if (user.is_valid()) {
firebase::Future<std::string> idToken = user.GetToken(true);
// Send token to your backend via HTTPS
// ...
}
Web
firebase.auth().currentUser.getIdToken(/* forceRefresh */ true).then(function(idToken) {
// Send token to your backend via HTTPS
// ...
}).catch(function(error) {
// Handle error
});
Assim que tiver um token de ID, você poderá enviar esse JWT para seu back-end e validá-lo usando o SDK Admin do Firebase ou uma biblioteca JWT de terceiros caso seu servidor tenha sido criado com uma linguagem que o Firebase não suporta nativamente.
Verificar os tokens de ID com o SDK Admin do Firebase
O SDK Admin do Firebase tem um método integrado para verificar e decodificar tokens de ID. Se o token de ID fornecido tiver o formato correto, não tiver expirado e estiver devidamente assinado, o método retornará o token de ID decodificado. É possível ver o
uid
do usuário ou o dispositivo do token decodificado.
Siga as instruções de configuração do SDK Admin para inicializá-lo
com uma conta de serviço. Em seguida, use o método verifyIdToken()
para verificar um token de ID:
Node.js
// idToken comes from the client app
getAuth()
.verifyIdToken(idToken)
.then((decodedToken) => {
const uid = decodedToken.uid;
// ...
})
.catch((error) => {
// Handle error
});
Java
// idToken comes from the client app (shown above)
FirebaseToken decodedToken = FirebaseAuth.getInstance().verifyIdToken(idToken);
String uid = decodedToken.getUid();
Python
# id_token comes from the client app (shown above)
decoded_token = auth.verify_id_token(id_token)
uid = decoded_token['uid']
Go
client, err := app.Auth(ctx)
if err != nil {
log.Fatalf("error getting Auth client: %v\n", err)
}
token, err := client.VerifyIDToken(ctx, idToken)
if err != nil {
log.Fatalf("error verifying ID token: %v\n", err)
}
log.Printf("Verified ID token: %v\n", token)
C#
FirebaseToken decodedToken = await FirebaseAuth.DefaultInstance
.VerifyIdTokenAsync(idToken);
string uid = decodedToken.Uid;
A verificação do token de ID requer um ID de projeto. O SDK Admin do Firebase tenta acessar esse ID usando um dos métodos a seguir:
- Se o SDK foi inicializado com uma opção de app
projectId
explicita, o SDK usará o valor dessa opção. - Se o SDK foi inicializado com credenciais de conta de serviço, ele usará o campo
project_id
do objeto JSON dessa conta. - Se a variável de ambiente
GOOGLE_CLOUD_PROJECT
estiver definida, o SDK usará o valor dela como o ID do projeto. Essa variável de ambiente está disponível para o código em execução na infraestrutura do Google, como o App Engine e o Compute Engine.
Verificar os tokens de ID com uma biblioteca JWT de terceiros
Caso seu back-end esteja em uma linguagem não suportada pelo SDK Admin do Firebase, você ainda poderá verificar os tokens de ID. Primeiro, encontre uma biblioteca JWT de terceiros para sua linguagem. Em seguida, verifique o cabeçalho, o payload e a assinatura do token de ID.
Verifique se o cabeçalho do token de ID está em conformidade com as seguintes restrições:
Reivindicações de cabeçalho do token de ID | ||
---|---|---|
alg |
Algoritmo | "RS256" |
kid |
ID da chave | Precisa corresponder a uma das chaves públicas listadas em https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com |
Verifique se o payload do token de ID está em conformidade com as seguintes restrições:
Reivindicações de payload do token de ID | ||
---|---|---|
exp |
Data de validade | Precisa estar no futuro. O tempo é medido em segundos desde a época do Unix. |
iat |
Emitido em | Precisa estar no passado. O tempo é medido em segundos desde a época do Unix. |
aud |
Público | Precisa ser seu código do projeto do Firebase, o identificador exclusivo do seu projeto do Firebase que pode ser encontrado no URL do console desse projeto. |
iss |
Emissor |
Precisa ser "https://securetoken.google.com/<projectId>" ,
em que <projectId> é o mesmo ID do projeto usado
para o aud acima.
|
sub |
Assunto | Precisa ser uma string que não esteja em branco e também o uid do usuário ou dispositivo. |
auth_time
|
Tempo de autenticação | Precisa estar no passado. A hora em que o usuário realizou a autenticação. |
Por fim, verifique se o token de ID foi assinado pela chave privada correspondente à declaração kid
do token. Veja a chave pública em https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com
e use uma biblioteca JWT para verificar a assinatura. Use o valor de max-age
no cabeçalho Cache-Control
da resposta desse ponto de extremidade para determinar quando atualizar as chaves públicas.
Após realizar todas as verificações acima, será possível usar o assunto (sub
) do token de ID como o uid
do usuário ou dispositivo correspondente.