Каков наилучший способ авторизации, идентификации и хранения деликатной информации о пользователях?

1

С целью изучения конечных точек я создаю приложение под названием "Где вы?". Приложение позволяет пользователям запрашивать местоположение других пользователей. Идея заключается в том, что она делает это, позволяя пользователю выбрать контакт, найти контакт по номеру телефона в моей конечной точке. Если найдено, это означает, что у контакта есть приложение, и GCM отправляется с запросом местоположения. Если контакт не найден, сообщение отправляется с URL-адресом, который запрашивает местоположение через браузер, выполняет http-сообщение указанного местоположения и возвращает сервер GCM обратно лицу, запрашивающему местоположение.

Мне нужно аутентифицировать пользователей приложения и хранить телефонные номера нескольких контактов, а также пользователей приложения. На данный момент я в основном сосредоточусь на стороне сервера.

Как я могу архивировать вышеуказанное безопасным образом?

До сих пор я user_required=True OAuth 2.0 для своего API и user_required=True качестве аргумента для моего декоратора Model.method. Результат в следующем коде:

from google.appengine.ext import endpoints
from google.appengine.ext import ndb
from protorpc import remote
from endpoints_proto_datastore.ndb import EndpointsModel

class User(EndpointsModel):
    owner = ndb.UserProperty()
    phone_number = ndb.StringProperty()
    reg_id = ndb.StringProperty()
    created = ndb.DateTimeProperty(auto_now_add=True)

@endpoints.api(name='whereareyoudroid', version='v1', 
               description='Where Are You Users')
class UserApi(remote.Service):
    @User.method(user_required=True,
                 response_fields=('id',),
                 path='user')
    def insert(self, user):
        user.owner = endpoints.get_current_user()
        user.put()
        return user

    @User.method(user_required=True,
                 request_fields=('id',),
                 path='user/{id}',
                 http_method='GET')
    def get(self, user):
        if not user.from_datastore:
            raise endpoints.NotFoundException('User not found.')
        return user

Но для приведенного выше кода требуется только действительная учетная запись gmail. Я думаю, что вы можете получить доступ к пользователю, если у вас уже есть номер телефона? Какой будет случай, если я ограничу поля ответов в методе get, чтобы исключить номер телефона... если кто-то не решит переустановить службу. Предложения? Комментарии?

Из этого я понимаю, что могу настроить свою конечную точку только для приема запросов из моих приложений. Это правильно? И если да, не мог ли кто-то извлечь информацию о потребности из apk или изменить ее для выполнения... зла? :)

Обновить:

  1. A делает запрос на размещение B

    Запросит конечную точку по номеру телефона, если не найдена, просто отправьте запрос на SMS-сообщение, если найдено... перейдите к 2.

  2. Запрос отправляется в приложение GAE

    Это делается путем вставки идентификатора конечной точки местоположения, который является идентификатором UUID, и отправляет GCM в B о запросе

  3. Приложение GAE проверяет, что секретный идентификатор находится в белом списке B

    Нет белого списка, а секретный идентификатор - UUID, поэтому этот шаг устраняется

  4. Затем приложение запрашивает местоположение B

    Если B решает предоставить доступ к нему, то местоположение B просто обновляет конечную точку местоположения на основе UUID

  5. После того как приложение получает эту информацию, оно затем проверяет, что оно отправляет эту информацию только пользователю, указанному в секретном идентификаторе

    Когда B обновляет его местоположение, GAE отправляет GCM в A, информируя об обновлении

  6. Затем информация отправляется безопасно клиенту A

    Готово! GCM и SMS (и HTTPS) можно считать безопасными... правильно?

    Обновление: GCM не безопасен... но действительно ли это так важно?

  • 1
    Из вашего описания не похоже, что существует какой-либо контроль доступа, т.е. если я знаю чье-то имя и ищу его номер телефона, я могу запросить, где он находится, если у меня есть учетная запись с вами (нравлюсь ли я им делать это или нет). Если это так, я бы не стал сильно беспокоиться о безопасности OAuth, это достаточно хорошо (потому что проблема безопасности в другом месте). Если бы вы только забыли упомянуть эту деталь, мои извинения. В этом случае я бы лично аутентифицировал пользователей с помощью криптографии с открытым ключом, так как это самый безопасный способ (...)
  • 1
    (...) хотя OAuth «достаточно хорош» для миллионов людей, но мне лично не нравится идея отдавать безопасность какой-то неизвестной другой стороне (что, в основном, и вы делаете). Хешированные пароли становятся все более и более хлопотными, и такие вещи, как bcrypt, на самом деле не настолько эффективны (по сравнению со стоимостью). Генерация открытого ключа из секретного ключа (если хотите, хешированного пароля) является достаточно эффективной (подумайте о кривой 25519), и ее нужно делать редко. Открытый ключ, хранящийся в вашей базе данных, бесполезен даже в случае утечки / кражи, и, в отличие от хэша, не является грубым взломом.
Показать ещё 3 комментария
Теги:
oauth
google-cloud-endpoints
endpoints-proto-datastore

1 ответ

3
Лучший ответ

Вы хотите приобрести довольно чувствительную комбинацию информации - электронную почту пользователя (как личность), номер телефона и местоположение.

Итак, во-первых, вы должны быть очень внимательны к проблемам конфиденциальности для пользователей, имея политику в отношении того, как эта информация хранится и распространяется, и разъяснять пользователям, что они разрешают. Я бы предложил не хранить как можно больше совокупность этого типа набора данных в клиенте.

Для этой цели я бы рекомендовал использовать хранилище GAE как можно больше.

Ваше приложение, запрашивающее местоположение пользователя, не должно быть слишком тревожным, если все сделано по защищенным каналам.

Что волнует, так это то, что эта информация достигает только разрешенного источника. т.е. что только взаимный контакт может запросить эту информацию.

Я бы предположил, что для каждого пользователя лучше всего использовать белый список разрешенных контактов. Для каждого пользователя есть секретный случайный uuid, связанный (который никогда не выходит никому из клиентов) в GAE. Пользователь, зарегистрировавшийся для вашей службы, создаст этот идентификатор. Затем белый список будет состоять из списка секретных идентификаторов.

Тогда процесс мог бы be-

  1. A делает запрос для местоположения B
  2. запрос отправляется в приложение GAE.
  3. Приложение GAE проверяет, что секретный идентификатор находится в белом списке B
  4. Затем приложение запрашивает местоположение B
  5. После того как приложение получает эту информацию, оно затем проверяет, что оно отправляет эту информацию только пользователю, указанному в секретном идентификаторе
  6. Затем информация отправляется безопасно клиенту A
  • 0
    Ваш процесс довольно близок к тому, что я имел в виду. Вы заставили меня понять, что удостоверение личности должно быть непоследовательным и не угадываемым. Я обновил свой вопрос на основе вашего ответа.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню