2017-01-27 18 views
2

В моем приложении-ответнике я извлекаю токен авторизации из Google и отправляю его на задний план, чтобы проверить его. Я последовал за https://developers.google.com/identity/sign-in/web/backend-auth, чтобы добиться этого, но мне нужно использовать данные, я получаю в обратном вызове вне обратного вызова:проверить токен google id и использовать данные из callback в node.js

const clientId = '<MyAppId>'; 
var auth = new GoogleAuth; 
var client = new auth.OAuth2(clientId, '', ''); 
client.verifyIdToken(
    input.googleAuthToken, 
    clientId, 
    function (e, login){ 
     if (login) { 
      var payload = login.getPayload(); 
      var googleId = payload['sub']; 
      console.log(googleId); //correct id is logged 
     } 
    } 
); 
//I need the 'googleId' here 

Так что это работает, но мне нужно googleId вне обратного вызова, чтобы проверить его с моим база данных. Как я могу это достичь?

ответ

4

Как видите, client.verifyIdToken является асинхронным, поэтому нет возможности ожидать возвращения значения в javascript в чистом синхронном режиме. Но вы можете писать и выполнять асинхронные функции синхронно (но он по-прежнему асинхронен под капотом, а выполнение JS продолжается), например, с обещаниями.

Рассмотрим несколько изменений в код:

const verifyToken = new Promise(function(resolve, reject){ 
    client.verifyIdToken(
     input.googleAuthToken, 
     clientId, 
     function (e, login){ 
      if (login) { 
       var payload = login.getPayload(); 
       var googleId = payload['sub']; 
       resolve(googleId); 
      } else { 
      reject("invalid token"); 
      } 
     } 
    ) 
}).then(function(googleId){ 
    //use googleId here 
}).catch(function(err){ 
    //error 
}) 

Таким образом, мы создаем обещание, что взять функцию с двумя параметрами: разрешить, и отклонять. Это функции, которые вы вызываете, когда получаете свою асинхронную стоимость. Таким образом, вы можете использовать синтаксис .then, который выполняет функцию, которая будет выполняться после того, как будет восстановлена ​​предыдущая функция в цепочке (с указанным вами значением, в этом случае токеном googleId). Узнайте больше о обещаниях here

0

Перейдите в Google Developer Console и сгенерируйте ключ API, после чего проверка упростится. (С "google-auth-library": "^1.1.0")

const { auth } = require('google-auth-library'); 
const client = auth.fromAPIKey('<YOUR_API_KEY>'); 

router.post('/', async (req, res) => { 
    const { idToken } = req.body; // idtoken from your react app 

    const res = await client.verifyIdToken({ idToken }); 

    const { email, name, picture, sub: googleid } = res.getPayload(); 
    const user = { email, name, picture, googleid }; 

    // transform to your local user 
    // ... 

    res.send(authUser); 
}); 

Не забудьте Hande исключения.

Надеюсь, что эта помощь.

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

  • Нет связанных вопросов^_^