2

This - это комментарий, который заставил меня задать этот вопрос.Неверный запрос API Google после истечения срока доступа к токену

У меня есть приложение Node.js на стороне сервера, используя пакет googleapis. Пользователи регистрируются в своих учетных записях Google, а я храню токены в их сеансе. Учетные данные, которые я получаю следующие

{ access_token: '<AN ACCESS TOKEN>', 
    token_type: 'Bearer', 
    id_token: '<A LONG ID TOKEN>', 
    expiry_date: <A TIMESTAMP> } // why do some places say there's an expires_in instead of this 

Там нет refresh_token, потому что пользователи уже вошли в первый раз и нажал принять, и я не хранить токен обновления (похоже, что я должен уже).

Итак, когда expiry_date достигается, если пользователь пытается сделать запрос для нас, чтобы сохранить что-то в их диск Google, я получаю сообщение об ошибке:

{ [Error: invalid_request] code: 400 } // ...no further details 

Мой 2 части вопроса:

  • Я предполагаю, что я получаю сообщение об ошибке, потому что access_token в моем объекте OAuth клиента истек (поскольку вызов отлично работает до истечения срока действия маркеров). Это верно? Почему сообщение об ошибке не более подробно?

  • В ответ на ответ вверху решение должно снова вызвать приглашение accept, получить токен обновления и сохранить его навсегда и использовать его для получения нового токена доступа по истечении срока его действия. Почему это лучший вариант, чем просто проверка того, истек ли токен, и повторная аутентификация пользователя, когда мы хотим позвонить в API? Какой «правильный» способ обеспечить, чтобы мои зарегистрированные пользователи всегда могли обращаться к API-интерфейсу накопителя для сохранения своих документов?

+0

это выглядит, как вы используете устаревшую конечную точку самоанализа маркера, так как 'expires_in' действительно стандартное поведение, которое реализуется с помощью Google в более поздних конечных точках –

+0

@HansZ. не могли бы вы пояснить здесь термины «конечная точка» и «интроспекция»? Для этого я использую последнюю версию google-клиента apis на node.js. –

ответ

4
  1. Правильно, 400 ответ из маркера доступа с истекшим сроком. Я не уверен, почему Google не дает больше подробностей, но для служб обычно используется код состояния 400, чтобы указать на какую-то проблему с учетными данными. Код состояния definition указывает, что это проблема с клиентом.

  2. Оба подхода будут работать, и каждый из них имеет свои преимущества и недостатки. Предлагаемый вами метод повторной аутентификации на стороне клиента имеет преимущество, заключающееся в упрощении реализации, поскольку вам не нужно хранить токен обновления и не нужно выполнять процесс обновления. Недостатком является то, что принуждение пользователя к повторной аутентификации каждый час менее удобно. По крайней мере, они будут перенаправлены от вашего приложения, и им, возможно, придется явно войти в систему или повторно авторизировать. Вам просто нужно взглянуть на компромиссы и выбрать, что лучше всего подходит для вашего случая использования.

+0

Мой альтернативный сценарий фактически просто принудил пользователя к повторной авторизации, если токен доступа истек. Это избавит вас от необходимости запрашивать «автономный» доступ, который мне не нужен. Чтобы уточнить, моя цель - разрешить даже пользователям, которые вошли в мое веб-приложение уже более часа, чтобы сохранить их данные на Google Диске (что мы делаем с помощью API). Чтобы постоянно хранить токен обновления каждого пользователя в базе данных, мне просто кажется, что мне нужно - зачем мне это делать? –

+0

@GeorgesPompidou: Вы можете, конечно, попросить своих пользователей повторно санкционировать каждый час, если хотите, но это скорее недружественный пользователь. Никто не хочет перенаправляться со страницы, на которой они находятся, и никто не может войти в систему. В отличие от этого, вам должно быть тривиально хранить токен обновления (вы уже сохраняете токен доступа), и это позволит вы должны обновлять авторизацию в течение длительного времени, не беспокоя своих пользователей. –

+0

Маркер доступа хранится в сеансе, который находится в базе данных в памяти и является эфемерным. Насколько я понимаю, токен обновления должен быть сохранен в долгосрочной базе данных моего приложения, связанной с каждым пользователем, если я только один раз попрошу разрешения для пользователя. Это связано с тем, что мне нужно запросить «автономный доступ», чтобы получить его (что, как я уже сказал, мое приложение не нуждается) кажется странным для меня. Вот почему я надеялся, что мне будет лучше. –

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