2017-09-18 3 views
0

Ich leide unter verify_id_token() Fehler mit (Google) Firebase Admin-SDK in Auth-Modul.binascii.Error: Falsche Auffüllung bei der Verwendung von Firebase admin-sdk, wenn ich das Benutzer-Token verifizieren

Wenn ich den Benutzer nach Benutzer-Token von Frontend js, authentifiziert authentifizieren.verify_id_token (Token) -Methode verify "binascii.Error: Falsche Auffüllung" Fehler.

Traceback dieses Fehlers ist unten.

Traceback (most recent call last): 
    File "/home/ubuntu/.pyenv/versions/3.6.2/lib/python3.6/site-packages/flask/app.py", line 1997, in __call__ 
    return self.wsgi_app(environ, start_response) 
    File "/home/ubuntu/.pyenv/versions/3.6.2/lib/python3.6/site-packages/flask/app.py", line 1985, in wsgi_app 
    response = self.handle_exception(e) 
    File "/home/ubuntu/.pyenv/versions/3.6.2/lib/python3.6/site-packages/flask/app.py", line 1540, in handle_exception 
    reraise(exc_type, exc_value, tb) 
    File "/home/ubuntu/.pyenv/versions/3.6.2/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise 
    raise value 
    File "/home/ubuntu/.pyenv/versions/3.6.2/lib/python3.6/site-packages/flask/app.py", line 1982, in wsgi_app 
    response = self.full_dispatch_request() 
    File "/home/ubuntu/.pyenv/versions/3.6.2/lib/python3.6/site-packages/flask/app.py", line 1614, in full_dispatch_request 
    rv = self.handle_user_exception(e) 
    File "/home/ubuntu/.pyenv/versions/3.6.2/lib/python3.6/site-packages/flask/app.py", line 1517, in handle_user_exception 
    reraise(exc_type, exc_value, tb) 
    File "/home/ubuntu/.pyenv/versions/3.6.2/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise 
    raise value 
    File "/home/ubuntu/.pyenv/versions/3.6.2/lib/python3.6/site-packages/flask/app.py", line 1612, in full_dispatch_request 
    rv = self.dispatch_request() 
    File "/home/ubuntu/.pyenv/versions/3.6.2/lib/python3.6/site-packages/flask/app.py", line 1598, in dispatch_request 
    return self.view_functions[rule.endpoint](**req.view_args) 
    File "/home/ubuntu/workdir/server/firebase.py", line 185, in postme 
    decoded_token = auth.verify_id_token(posted) 
    File "/home/ubuntu/.pyenv/versions/3.6.2/lib/python3.6/site-packages/firebase_admin/auth.py", line 98, in verify_id_token 
    return token_generator.verify_id_token(id_token) 
    File "/home/ubuntu/.pyenv/versions/3.6.2/lib/python3.6/site-packages/firebase_admin/auth.py", line 592, in verify_id_token 
    header = jwt.decode_header(id_token) 
    File "/home/ubuntu/.pyenv/versions/3.6.2/lib/python3.6/site-packages/google/auth/jwt.py", line 151, in decode_header 
    header, _, _, _ = _unverified_decode(token) 
    File "/home/ubuntu/.pyenv/versions/3.6.2/lib/python3.6/site-packages/google/auth/jwt.py", line 129, in _unverified_decode 
    signature = _helpers.padded_urlsafe_b64decode(signature) 
    File "/home/ubuntu/.pyenv/versions/3.6.2/lib/python3.6/site-packages/google/auth/_helpers.py", line 217, in padded_urlsafe_b64decode 
    return base64.urlsafe_b64decode(padded) 
    File "/home/ubuntu/.pyenv/versions/3.6.2/lib/python3.6/base64.py", line 133, in urlsafe_b64decode 
    return b64decode(s) 
    File "/home/ubuntu/.pyenv/versions/3.6.2/lib/python3.6/base64.py", line 87, in b64decode 
    return binascii.a2b_base64(s) 
binascii.Error: Incorrect padding 

Ich veröffentlichte den Client-Token per Javascript vom Client wie unten.

 var token = user.getIdToken() 
     var bapi = axios.create({ 
      baseURL: 'http://mypage.com', 
      timeout: 10000, 
      headers: { 
      'X-Requested-With': 'XMLHttpRequest' 
      } 
     }) 

     bapi.post('/postme', token) 
     .then(response => { 
      console.log(response) 
     }).catch(err => { 
      console.log(err) 
     }) 

Und dekodieren von Python (Kolben) bei angeforderten Server

@app.route('/postme',methods=['POST']) 
def postme(): 
    posted = request.data 
    decoded_token = auth.verify_id_token(posted) # error!! 

    # uid = decoded_token['uid'] 
    return uid 

Wer weiß, was zu tun ??

Antwort

1

Im JavaScript SDK ist user.getIdToken() als asynchrone Funktion implementiert (documentation), aber Ihr Code geht davon aus, dass er direkt einen String zurückgibt.

Daher empfängt Ihr Back-End Müll - was Sie bemerkt haben könnten, wenn Sie den Inhalt der Variablen posted ausgedruckt haben.


die JS-Funktion wie diese reorganisieren tatsächlich die ID-Token zu verwenden:

user.getIdToken() 
    .then(token => { 
     var bapi = axios.create({ 
      baseURL: 'http://mypage.com', 
      timeout: 10000, 
      headers: {'X-Requested-With': 'XMLHttpRequest'} 
     }); 

     return bapi.post('/postme', token); 
    }) 
    .then(response => { 
     console.log(response) 
    }).catch(err => { 
     console.log(err) 
    }) 
+0

Vielen Dank für Ihre Antwort. –

+0

Ich wusste nicht, dass user.getIdToken() Versprechen zurückgibt, und ich versuche, was Sie gesagt haben. Aber als ich '' 'bapi.post ('/ postme', Token) versucht;' '' in js Seite, Python-Server erhielt leere Zeichenfolge (b ''). –

+0

'' 'bapi.post ('/ postme', {token});' '' sieht gut aus, weil python server '' 'b '{" token ":" ... (codierte string) ... " } ''' 'was durch jwt.io bestätigt werden kann. Aber der gleiche Fehler ist aufgetreten. –

0

Schließlich dieses Problem @vzsg wurde gelöst durch (vielen Dank wieder).

Abschließend

  • user.getIdToken() in Firebase SDK (js) Renditen versprechen
  • auth.verify_id_token(token) in Feuerbasis Admin-sdk (Python) string nur codiert werden muss.
Verwandte Themen