Как я могу требовать поля API-токена в запросах?

В настоящее время я создаю серверную часть Google Cloud Endpoints с библиотекой endpoints-proto-datastore и сталкиваюсь с проблемой, требующей apikey при запросе пользователя. Как только пользователь входит в систему, он получает APIkey, который они отправляют обратно для последовательных операций ввода (что работает), но как мне потребовать имя пользователя/адрес электронной почты и apikey в GET? В настоящее время, если пользователь делает так:

@User.method(request_fields=('id', 'apiToken',), path='users', http_method='GET', name='user.get')
def user_get(self, query):
    return query

Пользователь извлекается из хранилища данных, потому что идентификатор правильный, и он полностью игнорирует apiToken. Как мне потребовать оба поля? (в другой заметке, как мне отправить обратно идентификатор пользователя по запросу?)




Ответы (2)


Если вы реализуете свою собственную схему ключей API, как предполагает ваш код, вам необходимо вручную проверить, является ли ключ API действительным или нет.

Ваш пример похож на пример из «базовый', и вы добавили параметры в соответствии с примером 'simple_get. Для некоторого фона в документах в примере «simple_get» упоминается, что «id» — это одно из пяти специальных вспомогательных свойств, автоматически определяемых EndpointsModel для общих операций, таких как получение по идентификатору. Вот почему ваш код работает автоматически, и вы не делаете ничего «специального» с параметром «id». Тем не менее, пример проверяет, существует ли объект, если вы пытаетесь его получить:

if not my_model.from_datastore:
      raise endpoints.NotFoundException('MyModel not found.')

Поскольку для вашего поля «apiKey» нет специального вспомогательного свойства, вам нужно добавить свой собственный код в метод, чтобы проверить, действителен ли ключ, и вернуть 401 или подходящую ошибку, если это не так. Другой вариант — использовать часть встроенной аутентификации Google в соответствии с 'basic_with_auth' пример.

Наконец, поскольку endpoints-proto-datastore — это просто синтаксический сахар для основной библиотеки конечных точек, вам следует прочитать полная документация по этому вопросу для получения дополнительной информации о таких вещах, как возврат значений из ваших методов конечных точек.

person Adam    schedule 02.11.2015
comment
Я не могу понять, как получить доступ к apiToken (из запроса) прямо сейчас, чтобы сравнить с токеном модели. Как прочитать информацию о запросе? Я, вероятно, делаю все это неправильно, но, например, обновление, пользователь, созданный endpoints proto, является дубликатом пользователя в хранилище данных, поэтому я могу сравнить его с сохраненным. - person Asitaka; 02.11.2015

Самый простой способ, который я нашел для этого:

   @User.method(request_fields=('id', 'apiToken',), path='users', http_method='GET', name='user.get')
def user_get(self, user_model):
    user = ndb.Key('User', int(user_model.id)).get()
    if user.apiToken != user_model.apiToken:
        raise endpoints.UnauthorizedException('You are not authorized to view this data')
    return user.clean()

В user_model будет храниться userId и apiToken, поэтому я вытаскиваю "настоящие" данные из ndb с ключом и проверяю, есть ли у user_model правильный токен и возвращаю модель, если она правильная, если нет, то отказываюсь

person Asitaka    schedule 05.11.2015