1

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

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

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

До сих пор я включил 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, чтобы исключить номер телефона ... если кто-то не решит переустановить службу. Предложения? Комментарии?

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

Update:

  1. делает запрос на месте Б

    Querys конечных точек по телефону если не найден просто отправить запрос за SMS , если найден ... перейти к 2 ,

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

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

  3. GAE приложение проверяет, что секрет ID A является на белом списке Б

    Там нет БелОГо и секрета идентификатора является UUID так что этот шаг устраняется

  4. Кроме того, приложение запрашивает для размещения Б

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

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

    Когда B обновляет это место GAE посылает GCM-а информируя об обновлении

  6. Информационных затем надежно отправленных на клиент а в

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

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

+1

из вашего описания, это не звучит, как есть любой вид контроля доступа, то есть, если я знаю, что чье-то имя и посмотреть свой номер телефона, я может запрашивать, где они находятся, пока у меня есть учетная запись (вам нравится, что я делаю t шляпа или нет). Если это так, я бы не стал беспокоиться о безопасности OAuth, это достаточно хорошо (потому что проблема безопасности в другом месте). Если вы только забыли упомянуть эту деталь, мои извинения. В этом случае я бы лично аутентифицировал пользователей с помощью криптографии с открытым ключом, так как это самый безопасный способ (...) – Damon

+1

(...), хотя OAuth «достаточно хорош» для миллионов людей, но мне лично не нравится идея отдать безопасность какой-то неизвестной другой стороне (что в основном вы делаете). Хэшированные пароли все более и более хлопотны, и такие вещи, как bcrypt, на самом деле не так эффективны (по сравнению с затратами). Генерирование открытого ключа из секретного ключа (хешированный пароль, если хотите) достаточно эффективен (думаю, кривая25519), и его нужно делать редко. Открытый ключ, хранящийся в вашей базе данных, бесполезен, даже если он просочился/украден, и в отличие от хэша не тривиально грубого принуждения. – Damon

+0

Не будет паролей, поскольку я намерен выполнить авторизацию с помощью Google ... по крайней мере, это то, что я думаю. – user672009

ответ

3

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

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

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

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

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

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

Процесс может затем быть-

  1. делает запрос на месте Б
  2. перенаправляется запрос на GAE приложения.
  3. GAE приложение проверяет, что секрет ID A находится на белом списке Б
  4. Приложение затем запрашивает местоположение Б
  5. Как только приложение получает эту информацию, а затем проверяет, что он только посылает эту информацию пользователя идентифицируется по-х секрет ID
  6. Информационный затем безопасно направлен клиент а в
+0

Ваш процесс довольно близок к тому, что я на самом деле имел в виду. Вы заставили меня понять, что идентификатор должен быть не последовательным и недопустимым. Я обновил свой вопрос, основываясь на вашем ответе. – user672009