Confusão em como usar o “IdToken” corretamente
Eu tenho tentado implementar umOAuth 2.0
processo de autenticação no meu aplicativo.
Temos um servidor back-end com API REST, totalmente codificado em Java e com Spring integrado.
O aplicativo está registrado emFirebase
(Posso acessá-lo através do console) e implementei com êxito oGoogle SignIn
processo e oEmail/Password
(os usuários são adicionados à minha base de usuários, conforme exibido no Firebase Console).
Meu problema aqui é provavelmente o meu fraco entendimento do processo OAuth: como eu o entendo, devo usarFirebaseUser.getIdToken(bool)
de dentro do aplicativo para obter oJWT
(JSON Web Token) que envio (através deHTTP Post
) ao servidor back-end para uma solicitação do usuário que exigiria autenticação (algo como enviar uma informação que nosso servidor deve salvar em nosso banco de dados do usuário na linha relacionada ao UID associado ao usuário que está enviando a solicitação).
Acreditoeste documento é o que devo seguir para alcançar meu objetivo. No entanto, essa parte dos trechos de código apresentados no documento me deixa confusa:
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();
}
}
});
oidToken
Estou recebendo 1232 caracteres. Sou obrigado a enviar toda a String? A estrutura fica assim:{alg,kid}.{iss,name,picture,aud,auth_time,user_id,sub,iat,exp,email,email_verified,firebase{...}}.XXX
. Existem alguns campos que eu recortaria, pois não os usarei no lado do servidor.Parece que não consigo acertar a parte "XXX" do meu idToken por enquanto. Sei que está relacionado a uma assinatura digital e que provavelmente preciso de uma Chave Pública e uma Chave Privada (ainda não tenho certeza de onde conseguir as melhores). Como faço para lidar com isso?O que pode// Send token to your backend via HTTPS
aparência (uma URL simples que contém a String ou existe uma maneira adequada de enviar o JWT)?O JWT todo o servidor precisa receber do cliente para o processo de autenticação?Posso enviar informações adicionais com o JWT (como o que a autenticação deve fazer quando for verificada)? Caso contrário, devo assumir que isso é feito após o servidor responder ao cliente que agora está aguardando uma solicitação do usuário agora autenticado?Vi pessoas chamando algum URL para verificar seu token, mas não tenho certeza sobre qual URL devo usar, qual token devo passar e o que devo esperar como resultado. Talvezhttps://www.googleapis.com/oauth2/v1/userinfo?access_token=1/fFBGRNJru1FQd44AzqT3Zg
ouhttps://www.googleapis.com/oauth2/v3/tokeninfo?id_token=XYZ123
?Qual é o papel doAdmin SDK
em tudo isso?Eu pensei que tinha acabado e que isso era tudo que eu precisava até me deparar comesse outro doc o que traz outras questões:
Fazimplementation 'com.google.firebase:firebase-admin:6.3.0'
só precisa estar no código do lado do servidor? Aparentemente sim!Onde conecto o meufirebase-adminsdk.json
arquivo em tudo isso?No Firebase Admin SDK, código de configuração fornecido pelo Google.FileInputStream serviceAccount = new FileInputStream("path/to/serviceAccountKey.json");
eFileInputStream refreshToken = new FileInputStream("path/to/refreshToken.json");
: qual arquivo JSON devo conectar lá?O mencionado acima!Meu servidor precisa ter ogoogle_services.json
integrado?Isso parece estar falando principalmente sobre o uso do FirebaseDatabase
. É possível usar meu próprio banco de dados (é um MySQL hospedado no GoDaddy)?Sim!Sinto muito se isso é um monte de perguntas. Eu sou um pouco novo por aqui.