2017-01-19 2 views
0

Ich versuche, Linkedin Signin zu implementieren und dann mit Firebase authentifizieren. Der einzige Weg, dies zu tun, da Linkedin nicht in dem aktuellen Firebase einfachen Login-Anbieter ist zu:JJWT Bibliothek zu Token für die Authentifizierung mit Firebase auf Android zu generieren

  1. Einloggen mit Linkedin, gewährt das Token als here gezeigt.
  2. Erhalten Sie die ID des Linkedin-Benutzers.
  3. Erstellen Sie ein Token wie Firebase angibt.
  4. Um signInWithCustomToken wie es here gibt an, nach dann die Prozedur über here:

    benutzerdefinierte Token Erstellen eines Drittanbieters JWT Bibliothek

Jetzt mit, ich habe alles getan, diese. Hier ist die Erzeugung von Token-Code mit JJWT Bibliothek:

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(); 

aber ich habe eine falsches Token-Format, weil:

iat Ausgabe-zum Zeitpunkt Die aktuelle Zeit in Sekunden seit der UNIX-Epoche

exp Ablaufzeit Die Zeit in Sekunden seit der UNIX-Epoche, zu der das Token abläuft. Es kann maximal 3600 Sekunden später als das iat sein. Hinweis: Dies steuert nur die Zeit, zu der das benutzerdefinierte Token selbst abläuft. Wenn Sie jedoch einen Benutzer unter Verwendung von signInWithCustomToken() signieren, bleiben sie im Gerät angemeldet, bis ihre Sitzung ungültig wird oder der Benutzer sich abmeldet.

Weil Firebase Sekunden und nicht Date will. Ich kann keinen langen Wert auf setIssuedAt oder setExpiration übergeben, da ein Date-Objekt als Parameter benötigt wird.

Also, wie kann ich einen langen Wert (die Sekunden) dort setzen? UPDATE: ich einen Weg gefunden haben, den Zeitstempel wie dies passieren:

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(); 

Aber immer noch falsch mein Token-Format ist:

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) 

Weiß jemand, was hier der Fehler ist? Ich kann es wirklich nicht herausfinden.

Antwort

0

Eine Date Con nicht mit Sekunden gebaut werden. Es benötigt einen Millisekundenwert. Dieser Code ist falsch.

Date current_date = new Date(nowSeconds); 

Verwenden Sie den folgenden Code

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(); 

Wenn Sie die zweite Art und Weise .claim() die Kluft, die Werte von 1000 verwenden möchten Sekunden

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

Hallo @pedrofb zu bekommen, Vielen Dank für Ihre Hilfe, ich kann meinen Fehler dort sehen. Aber das Hauptproblem hier war, dass ich meinen eigenen privaten Schlüssel erzeugte, während ich einen spezifischen privaten Schlüssel verwenden musste, den Firebase mir gibt. –

+0

Nach https://firebase.google.com/docs/auth/admin/create-custom-tokens müssen Sie, wenn Sie benutzerdefinierte JWT-Tokens erstellen, diese mit Ihrem eigenen privaten Schlüssel signieren. Firebase stellt Ihnen keinen RSA-Schlüssel zur Verfügung. Daher müssen Sie ein Schlüsselpaar generieren und speichern und es zum Signieren und Verifizieren verwenden. Kann das Firebase SDK auch diese Funktion sein – pedrofb

+0

Grundsätzlich, Firebase mir einen Projekt-Service-Account privaten Schlüssel, der im String-Format ist, und ich konvertiere es in meine RSA Private Key, die ich in der signWith-Methode verwenden muss. –

Verwandte Themen