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

С целью изучения конечных точек я создаю приложение под названием «Где вы?». Приложение позволяет пользователям запрашивать местоположение других пользователей. Идея заключается в том, что она делает это, позволяя пользователю выбрать контакт, найти контакт по номеру телефона в моей конечной точке. Если найдено, это означает, что у контакта есть приложение, и 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 проверяет, что секретный идентификатор A находится в белом списке B

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Затем процесс мог бы быть –

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