2017-09-18 10 views
0

auth 모듈의 (Google) firebase admin-sdk에서 verify_id_token() 오류가 발생합니다.binascii.Error : 사용자 토큰을 확인할 때 firebase admin-sdk를 사용하는 중에 잘못된 패딩이 발생했습니다.

frontend js에 의해 게시 된 사용자의 토큰으로 사용자를 확인하면 auth.verify_id_token (토큰) 메소드가 "binascii.Error : Incorrect padding"오류가 발생합니다.

이 오류의 추적은 아래와 같습니다.

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 

다음과 같이 클라이언트 토큰을 클라이언트에서 javascript로 게시했습니다.

 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) 
     }) 

그리고 요청 서버에서 파이썬 (플라스크)하여 디코딩

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

    # uid = decoded_token['uid'] 
    return uid 

사람이 무엇을 알고 있나요?

답변

1

JavaScript SDK에서 user.getIdToken()은 비동기 함수 (documentation)로 구현되었지만 코드에서는 String을 직접 반환한다고 가정합니다.

따라서 백엔드는 posted 변수의 내용을 인쇄 할 때 알아 차릴 수있는 쓰레기를 받고 있습니다. (너무 많은 당신을 다시 감사) @vzsg하는

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

답장을 보내 주셔서 감사합니다. –

+0

나는 user.getIdToken()이 약속을 되 돌리는 것을 몰랐다. 나는 당신이 말한 것을 시도했다. 그러나'''bapi.post ('/ postme', token);''를 js 측에서 사용하려고하면 파이썬 서버가 빈 문자열 (b '')을받습니다. –

+0

파이썬 서버가'''b '{ "token": "... (encoded string) ..."을 받았기 때문에''bapi.post ('/ postme ', {token}); } ''''이는 jwt.io에서 확인할 수 있습니다. 그러나 같은 오류가 발생합니다. –

0

마지막으로,이 문제가 해결 된 감사 :


실제로 ID 토큰을 사용하려면이 같은 JS 기능을 재구성. 중포 기지 SDK에서 결론적으로

,

  • user.getIdToken()은 (JS) 만 반환 문자열을 인코딩 필요가 중포 기지 관리-SDK (파이썬)에
  • auth.verify_id_token(token)
  • 을 약속드립니다.