# #java #android #firebase
Вопрос:
Я новичок в Firebase и хочу аутентифицировать firebase с помощью пользовательского токена на Android. Я реализовал Jwts для создания пользовательских токенов. Ниже приведен код для этого.
serializer=new Serializer<Map<String, ?>>() {
@Override
public byte[] serialize(Map<String, ?> stringMap) throws SerializationException {
return new byte[0];
}
};
resolver=new CompressionCodec() {
@Override
public String getAlgorithmName() {
return null;
}
@Override
public byte[] compress(byte[] payload) throws CompressionException {
return new byte[0];
}
@Override
public byte[] decompress(byte[] compressed) throws CompressionException {
return new byte[0];
}
};
deserializer=new Deserializer<Map<String, ?>>() {
@Override
public Map<String, ?> deserialize(byte[] bytes) throws DeserializationException {
return null;
}
};
Calendar calendar=Calendar.getInstance();
Date date=new Date();
calendar.setTime(date);
Calendar calendar1=calendar;
calendar.add(Calendar.SECOND,3550);//expiration time =iat time 3550 seconds
//Header Map
Map<String,Object> map=new HashMap<>();
map.put("alg", "HS256");
map.put("typ", "JWT");
//Claim map
Map<String ,Object> map1=new HashMap<>();
map1.put("uid",23423423);
map1.put("sub","firebase@PROJECT-ID.iam.gserviceaccount.com");
map1.put("iss","firebase@PROJECT-ID.iam.gserviceaccount.com");map1.put("aud","https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit");
map1.put("iat",calendar1.getTime().getTime());
map1.put("exp",calendar.getTime().getTime());
Key key= Keys.secretKeyFor(SignatureAlgorithm.HS256);
String customToken=Jwts.builder().setHeaderParams(map).setIssuedAt(calendar1.getTime())
.setExpiration(calendar.getTime())
.setClaims(map1)
.serializeToJsonWith(serializer)
.compressWith(resolver)
.signWith(key).compact();
MainActivity.instance_main.showToast(customToken);
final FirebaseAuth mAuth=FirebaseAuth.getInstance();
mAuth.signInWithCustomToken(customToken).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(task.isSuccessful())
{
// Sign in success, update UI with the signed-in user's information
Log.d("FIREBASE_LOGIN_STATUS", "signInWithCustomToken:success");
FirebaseUser user = mAuth.getCurrentUser();
MainActivity.instance_main.showToast("LOGGEDIN_FIREBASE : " user.toString());
}
else
{
Log.w("FIREBASE_LOGIN_STATUS", "signInWithCustomToken:failure", task.getException());
MainActivity.instance_main.showToast("LOGGEDIN_FIREBASE : FAILED");
MainActivity.instance_main.showToast(task.getException().getMessage());
}
// updateUI(user);
}
});
ИДЕНТИФИКАТОР ПРОЕКТА-это идентификатор проекта. Но вход в Firebase завершается ошибкой со следующим исключением — неверный формат пользовательского токена. Пожалуйста, ознакомьтесь с документацией.[неверный формат утверждения, отсутствует сегмент.] Я попытался найти решение в Интернете, но безуспешно. Пожалуйста, помогите мне решить эту проблему. И, пожалуйста, игнорируйте любые ошибки, не связанные непосредственно с этой проблемой.
Комментарии:
1. Вы пытаетесь создать пользовательский токен из приложения для Android, которое затем также использует этот токен? Это крайне небезопасно, так как позволяет любому создать любой токен, который он хочет, и подписать его.
2. @FrankvanPuffelen Я попытался создать токен custome из jwt.io но сгенерированный оттуда токен также не работает. Любые предложения о том, как создать сторонний пользовательский токен.
3. @FrankvanPuffelen, и я также не уверен, что будет iat и exp для пользовательского токена, созданного третьей стороной. Как токен будет действителен только в течение 1 часа(3600 секунд). должен ли я генерировать его снова и снова.
4. Для создания пользовательского токена для проекта требуется указать учетные данные администратора/закрытый ключ для этого проекта, что должно выполняться только в доверенной среде. См. Эту страницу для получения списка опций о том, как безопасно сгенерировать такой токен: firebase.google.com/docs/auth/admin/create-custom-tokens