2016-05-30 3 views
3

У меня есть собственный OAuth 2-сервер, работающий на Node.js v4.4.5, со всем этим материалом:Firebase 3 Auth + Node + jsonwebtoken: Недопустимая лексема

"bcrypt-nodejs": "0.0.3", 
"body-parser": "^1.15.1", 
"cors": "^2.7.1", 
"express": "~4.1.1", 
"firebase": "^3.0.3", 
"mongoose": "^4.4.19", 
"oauth2orize": "^1.3.0", 
"passport": "^0.3.2", 
"passport-jwt": "^2.0.0", 
"passport-local": "^1.0.0" 
"jsonwebtoken": "^7.0.0" 

Я логин и получить JWT, что , согласно jwt.io, можно декодировать, но я не могу проверить, так как у меня нет открытого ключа.

Я получаю JWT и отправить его в signInWithCustomToken, а затем я получаю сообщение об ошибке от https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyCustomToken?key=AIzaSy ....

{ 
     "error": { 
     "errors": [ 
     { 
      "domain": "global", 
      "reason": "invalid", 
      "message": "INVALID_CUSTOM_TOKEN" 
     } 
     ], 
     "code": 400, 
     "message": "INVALID_CUSTOM_TOKEN" 
    } 
} 

В моих auth.js контроллер, я создать JWT, как так:

var token = jwt.sign(
    { 
     iss: jwt_config.client_email, 
     sub: jwt_config.client_email, 
     aud: 'https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit', 
     iat: iat, 
     exp: exp, 
     uid: user._id, 
     claims: { 
      username: user.username, 
      user_id: user._id, 
      roles: user.role 
     } 
    }, 
    jwt_config.private_key, 
    { 
     algorithm: 'RS256' 
    } 
); 
res.json({success: true, token: token}); 

загружает данные учетной записи службы в jwt_config:

var jwt_config = require('../config/Firebase-68824d8xxxxx.json'); 

Это виновный JWT:

eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJwcm9qZWN0QHByb2plY3QtODE5NTMxNDA4ODMzNzM0MzUwMy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInN1YiI6InByb2plY3RAcHJvamVjdC04MTk1MzE0MDg4MzM3MzQzNTAzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYXVkIjoiaHR0cHM6Ly9pZGVudGl0eXRvb2xraXQuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLmlkZW50aXR5LmlkZW50aXR5dG9vbGtpdC52MS5JZGVudGl0eVRvb2xraXQiLCJpYXQiOjE0NjQ1ODIzMDEsImV4cCI6MTQ2NDY5MDMwMSwidWlkIjoiNTc0YTJmNWJmODRhZTMwOTdkMjNiZWQ1IiwiY2xhaW1zIjp7InVzZXJuYW1lIjoiamxwZWxsaWNlciIsInVzZXJfaWQiOiI1NzRhMmY1YmY4NGFlMzA5N2QyM2JlZDUiLCJyb2xlcyI6IlN0dWRlbnQifX0.gDghMzXc2sFP4XbMhrU2kxo7u0yte4PT03AbeyzT8oGLYJEHJOAY-kZT0l_fGWDi68AfVCaEiHeFj1a3-M95i4NRTQErWyGPuqqS9ii2m0mDaBseFZumk5iTTWiqY8Tpo6_7fkWGsuM7fnuXjaMKV8jkOW S913EE3DQmXHT5bwPe-ку-xTFxU0P3VPWzbgw5T5lExmzpv0x78Fr-RCy45QhfJ3IeVa-Pyhnp4_NY9VAi1naJLpwKKo7aVq3uLujMK8ViNSgfdXTqI9VNq7KrdgqSKnpdoZ2ph_J6fHBnHtAhV6F_Iy_FyC7Zg1EyC_4vMpBJuMx5UYzy6f1Gm0wvHw

Когда я получаю его обратно на мили странице входа, я посылаю его к Firebase:

firebase.initializeApp(config); 
$.ajax({ 
    type: 'post', 
    dataType: 'json', 
    url: 'http://ec2-52...compute.amazonaws.com:3000/api/authenticate', 
    data: $('#loginForm').serialize(), 
    complete: function(result) { 
     result = result.responseJSON; 
     // console.log(JSON.stringify(result, null, 4)); 
     var success = result.success; 
     if (success) { 
      var data = result.token; 

      firebase.auth().signInWithCustomToken(data).catch(function(error) { 
       // Handle Errors here. 
       var errorCode = error.code; 
       var data = error.message; 
       // ... 
      }); 

     } else { 
      var data = result.message; 
     } 
     $('#token').html(data); 
    } 
}); 

А вот где ошибка всплывает.

Я в тупике, что мне делать?

Должен ли я заглянуть в другой модуль для создания JWT?

Есть ли способ узнать, что конкретно не так в JWT?

Спасибо!

ответ

2

Ну, я сделал это! Оказывается, что в моих утверждениях имя пользователя и user_id были объектами! Таким образом, делая это:

claims: { 
    username: String(user.username), 
    user_id: Strint(user._id), 
    roles: user.role 
} 

это работает!

Надеюсь, что кто-то посчитает это полезным.

+3

Судя по ... в основном миллион ... вопросы о системе Firebase 3 auth, можно с уверенностью сказать, что их ответы API и/или их документы недостаточны. Некоторые ответы от авторов и сопровождающих пассивно-агрессивно полезны в лучшем случае, и плоские бесполезны в другое время. Спасибо за публикацию решения при решении этой проблемы! – snakesNbronies

0

В аналогичной ситуации токен, созданный на стороне сервера, был создан с истечением 2 часов. При создании токена не было ошибок, только при попытке использовать его на стороне клиента. Изменение срока действия до одного часа устраняло проблему «Недействительный пользовательский токен».

Смежные вопросы