Связывание аккаунта с моим собственным сервером OAuth в Действиях в Google отсутствует тип предоставления - PullRequest
0 голосов
/ 12 января 2020

Я пытаюсь реализовать действие SmartHome. Это началось с этого примера
https://codelabs.developers.google.com/codelabs/smarthome-washer/#0
И это работало.

В этом примере в качестве облачной службы используется firestore.
Я хочу реализовать сервер с помощью себя. Для первого теста в качестве сервера на моем локальном сервере P C, который доступен с переадресацией портов.
Я создал зашифрованный сертификат Let's и использует nodejs express htpps сервер.
Для реализации Oauth I использует тот же «незащищенный» код, что и в примере.

    expressApp.get('/fakeauth', async (req, res) => {
        console.log('fakeauth',req.headers, req.body, req.query);
        const responseurl = util.format('%s?code=%s&state=%s',
          decodeURIComponent(req.query.redirect_uri), 'xxxxxx',
          req.query.state);
        console.log(responseurl);
        return res.redirect(responseurl);
    });

    expressApp.all('/faketoken', async (req, res) => {
        console.log('faketoken',req.headers, req.body, req.query);
        const grantType = req.query.grant_type
          ? req.query.grant_type : req.body.grant_type;
        const secondsInDay = 86400; // 60 * 60 * 24
        const HTTP_STATUS_OK = 200;
        console.log(`Grant type ${grantType}`);

        let obj;
        if (grantType === 'authorization_code') {
          obj = {
            token_type: 'bearer',
            access_token: '123access',
            refresh_token: '123refresh',
            expires_in: secondsInDay,
          };
        } else if (grantType === 'refresh_token') {
          obj = {
            token_type: 'bearer',
            access_token: '123access',
            expires_in: secondsInDay,
          };
      }
        res.status(HTTP_STATUS_OK)
          .json(obj);
    });

Теперь я изменил URL-адреса учетной записи, привязывающие к моему локальному серверу. Когда я пытаюсь подключиться к этому действию, оно не работает.

Запрос к конечной точке fakeauth в порядке.
Но когда Google вызывает конечную точку faketoken, запросы отсутствуют, а тело пусто.
Запрашиваемый URL-адрес ... / faketoken без запроса и пустого тела.

Это не может быть проблемой с ответом на запрос fakeauth, потому что если я отправлю запрос fakeauth на свой сервер и запрос faketoken на сервер firestore, на котором работает привязка учетных записей.
Вторая попытка.
Отправка fakeauth на сервер firestore и faketoken на мой сервер.
Результат тот же. Нет запросов и нет тела.

Я не знаю, что я делаю неправильно, потому что это неправильный запрос от Google.

Кто-нибудь есть идеи, что не так. Я искал, но не смог найти кого-то, у кого такая же проблема.

Спасибо за вашу помощь.
С уважением, Саймон

Ответы [ 2 ]

0 голосов
/ 05 февраля 2020

Чтобы помочь другим, я опишу проблему.

Я думал, что данные отправляются как URL-запрос, потому что код читает их из объекта запроса.

Но они отправляются в тело с типом содержимого: application/x-www-form-urlencoded

Если я использую

expressApp.use(bodyParser.urlencoded());

Данные добавляются в запросы, и оригинальный тестовый код работает.

0 голосов
/ 22 января 2020

Вы можете использовать Google OAuth Playground , чтобы убедиться, что реализация привязки вашей учетной записи работает правильно. Вот как вы можете настроить этот инструмент для тестирования вашей пользовательской конечной точки:

  1. Откройте Настройки передача, измените Конечные точки OAuth на Пользовательские
  2. Введите свои URL авторизации и токена с консоли действий
  3. Введите свой идентификатор клиента и секрет с консоли действий

Вы не будете авторизовать Google API, поэтому для Шаг 1 вы можете просто ввести что-то вроде «устройства» и нажать Авторизовать API . Вы можете выполнить последовательность действий на шаге 2, чтобы убедиться, что авторизация и обмен токенами работают правильно. Инструмент сообщит, если в потоке возникнут ошибки.

...