0

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

  1. 使用 Linkedin 登录,授予令牌,如此处所示。
  2. 获取 Linkedin 用户的 ID。
  3. 就像 Firebase 指示的那样制作一个令牌。
  4. 为了signInWithCustomToken就像这里所指示的那样,请按照这里程序进行:

    使用第三方 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 Issued-at time 当前时间,自 UNIX 纪元以来的秒数

exp 过期时间 自 UNIX 纪元以来令牌过期的时间,以秒为单位。最多可以比 iat 晚 3600 秒。注意:这仅控制自定义令牌本身到期的时间。但是,一旦您使用 signInWithCustomToken() 让用户登录,他们将保持登录到设备,直到他们的会话无效或用户退出。

因为 Firebase 想要秒而不是日期。我不能在setIssuedAtor上传递长值setExpiration,因为需要 Date 对象作为参数。

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

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)

有谁知道这里有什么错误?我实在想不通。

4

1 回答 1

0

一个Date骗局不是用秒来建立的。它需要一个毫秒值。此代码不正确。

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)
于 2017-01-22T16:04:47.597 回答