Каков наилучший способ авторизации, идентификации и хранения деликатной информации о пользователях?
С целью изучения конечных точек я создаю приложение под названием "Где ты?". Приложение позволяет пользователям запрашивать местоположение других пользователей. Идея состоит в том, что он делает это, позволяя пользователю выбрать контакт, найти контакт по номеру телефона в моей конечной точке. Если найдено, это означает, что у контакта есть приложение, и GCM отправляется с запросом местоположения. Если контакт не найден, отправляется SMS с 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, чтобы исключить номер телефона... если только кто-то не решит перебить службу. Предложения? Комментарии?
Отсюда я понимаю, что могу настроить свою конечную точку так, чтобы она принимала запросы только от моих приложений. Это правильно? И если так, не может ли кто-то извлечь нужную информацию из apk или изменить ее для выполнения... зла?:)
Обновить:
A делает запрос на местоположение B
Запрашивает конечную точку по номеру телефона, если не найден, просто отправьте запрос на SMS, если найден... перейдите к 2.
Запрос перенаправлен в приложение GAE
Это делается путем вставки конечной точки Location, id которой является UUID, и отправляет GCM в B о запросе.
Приложение GAE проверяет, что секретный идентификатор A находится в белом списке B
Белый список отсутствует, а секретный идентификатор - это UUID, поэтому этот шаг исключен
Затем приложение запрашивает местоположение B
Если B решает предоставить доступ к своему местоположению, B просто обновляет конечную точку Location на основе UUID.
Как только приложение получает эту информацию, оно затем проверяет, что оно только отправляет эту информацию пользователю, идентифицированному секретным идентификатором A
Когда B обновляет свое местоположение, GAE отправляет GCM A, информируя об обновлении
Затем информация надежно отправляется клиенту А
Готово! GCM и SMS (и HTTPS) можно считать безопасными... верно?
Обновление: GCM небезопасен... но так ли это важно?
1 ответ
Вы хотите приобрести довольно чувствительную комбинацию информации - адрес электронной почты пользователя (в качестве удостоверения личности), номер телефона и местоположение.
Итак, во-первых, вы должны быть очень внимательны к вопросам конфиденциальности для пользователей, иметь политику в отношении того, как эта информация хранится и распространяется, и разъяснять пользователям, что они разрешают. Я бы посоветовал не хранить как можно больше агрегатов этого типа в клиенте.
Для этого я бы рекомендовал максимально использовать хранилище GAE.
Ваше приложение, запрашивающее местоположение пользователя, не должно быть слишком беспокойным, если все сделано по защищенным каналам.
Что вызывает беспокойство, так это то, что эта информация достигает только разрешенного источника. то есть, что только взаимный контакт может запросить эту информацию.
Я бы предположил, что для каждого пользователя лучше всего использовать белый список разрешенных контактов. Для каждого пользователя есть привязанный к GAE секретный случайный uuid (который никогда не выходит ни одному клиенту). Пользователь, регистрирующийся на ваш сервис, создаст этот идентификатор. Белый список тогда будет состоять из списка секретных идентификаторов.
Процесс может быть
- A делает запрос на местоположение B
- запрос перенаправляется в приложение GAE.
- Приложение GAE проверяет, что секретный идентификатор A находится в белом списке B
- Затем приложение запрашивает местоположение B
- Как только приложение получает эту информацию, оно затем проверяет, что оно только отправляет эту информацию пользователю, идентифицированному секретным идентификатором A
- Затем информация надежно отправляется клиенту А