Пользовательский токен Firebase с JWTS

# #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