Как стать автором
Обновить

Проверка идентификации клиента с использованием Push уведомлений

Очень часто возникает такая задача: есть общедоступный веб сервис или ресурс, мы не хотим обременять клиентов аутентификацией, но хотим уникально идентифицировать их (клиентов) каким-либо образом при обращении к сервису или ресурсу.
Я буду рассматривать только одну из областей, где такая задача может возникнуть, и область эта — приложения для мобильных платформ (к слову сказать, изложенная далее идея может быть применена и в качестве замены всем уже привычной капчи).

Начну с примера, который, надеюсь, поможет более четко обрисовать задачу.
Итак, есть мобильное приложение, которое позволяет «анонимно» отправить сообщение другим пользователям, так же использующим данное приложение. Отправляем сообщения мы через общедоступный веб сервис. Надо иметь две возможности: во-первых, каким-либо образом идентифицировать отправителя; и во-вторых, проверить, что идентификатор, который мы получили от клиента, действительно клиента идентифицирует.
Небольшое отступление: далее я буду вести речь о платформе Windows Phone, но, думаю, идея может быть легко применена для iOS, а также Android и др.

Идентификация клиента


Те, кто знаком с Windows Phone эту часть могут пропустить ибо, наверняка, они уже знают, как это сделать.
Для тех же, кто еще не догадался, ответ таков: клиента может уникально идентифицировать идентификатор устройства. Сделать это можно используя метод DeviceExtendedProperties.TryGetValue

На стороне веб сервиса остается только удостовериться что клиент именно тот, за кого себя выдает. И тут собственно и начинается самое интересное.

Валидация клиента


Итак, у нас есть некий идентификатор клиента, надо его как-то проверить.

схемаА для этого сделаем мы вот что: давайте попросим клиента сообщить нам дополнительно Notification Channel Uri для Push уведомлений, свяжем его с нашим идентификатором и сохраним. Получить Channel Uri мы можем легко с помощью одноименного свойства ChannelUri у класса HttpNotificationChannel

Когда же нам нужно проверить идентификатор клиента, мы будем генерить уникальное число, отправлять его в виде raw уведомления на Channel Uri ассоциированный с идентификатором и просить клиента прислать нам число обратно. А дальше, всего лишь дело техники, имея комбинацию идентификатора устройства и уникального числа проверить их совпадение.

Для того чтобы злоумышленник не обошел нашу систему и не начал посылать разные идентификаторы устройств для одного и того же канала Push уведомлений, мы должны проверять уникальность присланного Channel Uri при вставке записи в базу.

Вот собственно и все.

Счастливые обладатели устройств под управлением Windows Phone 7 могут опробовать работу данного подхода в действии, скачав приложение Поздравь Всех, а за одно и поздравить нас всех с наступающим Новым Годом. Приложение абсолютно бесплатно. Если будут интересны подробности реализации приложения, то с радостью готов их осветить.

На данный момент я не могу придумать способа, которым можно обойти проверку. Буду очень рад комментариям, а в особенности критике идеи.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.