JJWT库生成令牌,用于在Android上与Firebase进行身份验证

JJWT库生成令牌,用于在Android上与Firebase进行身份验证,android,firebase,token,firebase-authentication,jjwt,Android,Firebase,Token,Firebase Authentication,Jjwt,我正在尝试实现Linkedin登录,然后通过Firebase进行身份验证。由于Linkedin不在当前Firebase简单登录提供程序中,因此唯一的方法是: 使用Linkedin登录,如图所示授予令牌 获取Linkedin用户的Id 按照Firebase的指示制作一个令牌 为了按照指示使用CustomToken进行登录,请执行以下步骤: 使用第三方JWT库创建自定义令牌 现在,我已经做了所有这些。以下是使用JJWT库生成令牌代码: long nowSeconds = System.curren

我正在尝试实现Linkedin登录,然后通过Firebase进行身份验证。由于Linkedin不在当前Firebase简单登录提供程序中,因此唯一的方法是:

  • 使用Linkedin登录,如图所示授予令牌
  • 获取Linkedin用户的Id
  • 按照Firebase的指示制作一个令牌
  • 为了按照指示使用CustomToken进行
    登录,请执行以下步骤:
    使用第三方JWT库创建自定义令牌

  • 现在,我已经做了所有这些。以下是使用JJWT库生成令牌代码:

    long nowSeconds = System.currentTimeMillis()/1000;
            Date current_date = new Date(nowSeconds);
            KeyPair myKey = RsaProvider.generateKeyPair();
            long expMillis = nowSeconds + 3000;
            Date exp_time = new Date(expMillis);
            String compactJws = Jwts.builder()
                    .setSubject(ACCOUNT_EMAIL)
                    .setIssuer(ACCOUNT_EMAIL)
                    .setAudience("https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit")
                    .setIssuedAt(current_date)
                    .setExpiration(exp_time)
                    .setId(linkedinId)
                    .signWith(SignatureAlgorithm.RS256, myKey.getPrivate())
                    .compact();
    
    但我的令牌格式不正确,因为:

    在当前时间发出的iat自UNIX纪元以来的秒数

    exp Expiration time自UNIX纪元起令牌过期的时间(以秒为单位)。最长可能在3600秒之后 而不是国际航空运输协会。注意:这仅控制自定义令牌 它本身就过期了。但一旦您使用登录用户 signInWithCustomToken(),它们将保持登录到设备的状态 直到他们的会话无效或用户注销

    因为Firebase需要秒而不是日期。我无法在
    setIssuedAt
    setExpiration
    上传递长值,因为需要一个日期对象作为参数

    那么,我如何在那里输入一个长值(秒)? 更新: 我找到了一种传递时间戳的方法,如下所示:

    long nowSeconds = System.currentTimeMillis()/1000;
            Date current_date = new Date(nowSeconds);
            KeyPair myKey = RsaProvider.generateKeyPair();
            long expSeconds = nowSeconds + 3000;
            Date exp_time = new Date(expSeconds);
            String compactJws = Jwts.builder()
                    .setSubject(ACCOUNT_EMAIL)
                    .setIssuer(ACCOUNT_EMAIL)
                    .setAudience("https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit")
                    .claim("iat",current_date.getTime())
                    .claim("exp",exp_time.getTime())
                    .claim("uid",uid)
                    .signWith(SignatureAlgorithm.RS256,myKey.getPrivate())
                    .compact();
    
    但我的令牌格式仍然不正确:

     E/AndroidRuntime: FATAL EXCEPTION: main
                                                                              Process: com.example.qrcodereader, PID: 24239
    
    
    com.google.android.gms.tasks.RuntimeExecutionException: com.google.firebase.auth.FirebaseAuthInvalidCredentialsException: The custom token format is incorrect. Please check the documentation.
                                                                              at com.google.android.gms.tasks.zzh.getResult(Unknown Source)
                                                                              at com.example.qrcodereader.LoginActivity$6.onComplete(LoginActivity.java:268)
                                                                              at com.google.android.gms.tasks.zzc$1.run(Unknown Source)
                                                                              at android.os.Handler.handleCallback(Handler.java:739)
                                                                              at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                              at android.os.Looper.loop(Looper.java:148)
                                                                              at android.app.ActivityThread.main(ActivityThread.java:7325)
                                                                              at java.lang.reflect.Method.invoke(Native Method)
                                                                              at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                                              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
                                                                           Caused by: com.google.firebase.auth.FirebaseAuthInvalidCredentialsException: The custom token format is incorrect. Please check the documentation.
                                                                              at com.google.android.gms.internal.zzbix.zzcb(Unknown Source)
                                                                              at com.google.android.gms.internal.zzbiu$zzj.zza(Unknown Source)
                                                                              at com.google.android.gms.internal.zzbjf.zzcc(Unknown Source)
                                                                              at com.google.android.gms.internal.zzbjf$zza.onFailure(Unknown Source)
                                                                              at com.google.android.gms.internal.zzbja$zza.onTransact(Unknown Source)
                                                                              at android.os.Binder.execTransact(Binder.java:453)
    

    有人知道这里出了什么错吗?我真的搞不懂。

    A
    Date
    con不能用秒来构建。它需要一个毫秒值。此代码不正确

    Date current_date = new Date(nowSeconds);
    
    使用以下代码

    KeyPair myKey = RsaProvider.generateKeyPair();
    Date current_date = new Date();
    Calendar calendar = Calendar.getInstance(); 
    calendar.add(Calendar.SECOND, 3000);
    Date exp_time = calendar.getTime();
    String compactJws = Jwts.builder()
            .setSubject(ACCOUNT_EMAIL)
            .setIssuer(ACCOUNT_EMAIL)
            .setAudience("https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit")
            .setIssuedAt(current_date)
            .setExpiration(exp_time)
            .setId(linkedinId)
            .signWith(SignatureAlgorithm.RS256, myKey.getPrivate())
            .compact();
    
    如果要使用第二种方法
    .claim()
    将值除以1000得到秒

    .claim("exp",exp_time.getTime()/1000)
    

    嗨@pedrofb,谢谢你的帮助,我可以看出我的错误。但这里的主要问题是,我生成了自己的私钥,而我需要使用Firebase提供给我的特定私钥。根据,如果创建自定义JWT令牌,则必须使用自己的私钥对其进行签名。Firebase不会为您提供RSA密钥。因此,您必须生成并存储密钥对,并使用它进行签名和验证。可能是firebase SDK也有此功能基本上,firebase为我提供了一个项目的服务帐户私钥,它是字符串格式的,我将其转换为我的RSA私钥,我必须在signWith方法中使用。好的,我不知道。那么您的问题是如何从字符串构建RSA
    PrivateKey
    ?你能在你的问题中贴出第一个字符或查看格式的键吗?可能是PEM编码的。可能它有头
    ---BEGIN PRIVATE KEY-----
    并且内容是用base64编码的。嘿,不,不,现在没事了。我昨天已经解决了我的问题:D