Уникальная идентификация устройства в iOS

Я разрабатываю корпоративное приложение на iPad для определенных бизнес-требований. Это приложение предназначено для использования на определенном количестве устройств, предварительно заданном администратором.

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

Редактирует:

Скажем, у меня есть 2 устройства, и у меня есть учетные данные для входа в приложение, и мне нужно ограничить вход с устройств, которые не принадлежат мне. Для этого я должен определить, поступает ли запрос на вход с моего устройства или нет.

Раньше для этого можно было использовать UDID устройства, но теперь это устарело.

Может ли кто-нибудь предложить способ реализовать это?


person Manu Antony    schedule 23.09.2014    source источник
comment
у вас есть сервер авторизации? который предоставляет API для регистрации/снятия с регистрации? В этом случае я поделюсь подходом, который мы используем в нашем корпоративном приложении B2B.   -  person bllakjakk    schedule 23.09.2014
comment
Извините, у меня нет сервера авторизации. У нас есть только сервер, с которым приложение связывается. мы планируем проверить устройство с помощью этого сервера.   -  person Manu Antony    schedule 23.09.2014
comment
Я добавил свой подход, удалив часть, связанную с сервером аутентификации. Сделайте обзор для вашего варианта использования.   -  person bllakjakk    schedule 23.09.2014


Ответы (7)


попробуй это. для получения дополнительной информации см. UIDevice

// IOS 6+
    NSString *uniqueIdentifier = [[NSString alloc] initWithString:[[[UIDevice currentDevice] identifierForVendor] UUIDString]];
person Deepak    schedule 23.09.2014
comment
идентификаторForVendor генерируется только во время выполнения, что означает, что мы получаем этот идентификатор только после установки приложения. Но в моем случае мне нужно явно указать список устройств на взаимодействующем сервере. так что я могу проверить, является ли это авторизованным устройством или нет. - person Manu Antony; 23.09.2014
comment
тогда ответ Гвоздаря правильный. вам нужно использовать корпоративную систему распространения Apple. - person Deepak; 23.09.2014

Вы можете использовать iCloud здесь, потому что UUID устарел, а vendorId уникален, но может измениться, если вы удалите приложение и установите его снова,

Поэтому я бы предположил, что iCloud будет безопаснее, что вы можете сделать, так это во время запуска приложения вы можете создать один уникальный токен и сохранить его в хранилище данных iCloud вместе с учетными данными пользователя,

Таким образом, в следующий раз, когда пользователь попытается войти в систему, вы можете проверить это с помощью iCloud.

person Parth Pandya    schedule 23.09.2014

Как насчет использования корпоративной системы дистрибуции Apple? Это позволит вам развернуть приложение в корпорации и иметь жесткий контроль доступа.

https://developer.apple.com/programs/ios/enterprise/

person Nailer    schedule 23.09.2014
comment
Привет Найлер, спасибо. На самом деле приложение в настоящее время доступно в магазине приложений (которое не создано с корпоративной лицензией), и мне нужно сделать обновление для него, включив эту функцию. - person Manu Antony; 23.09.2014
comment
В порядке. Судя по вашему вопросу, это казалось жизнеспособным решением :) - person Nailer; 23.09.2014
comment
Предложенная идея достаточно хороша, но мое приложение уже находится в магазине приложений, и я читал о том, что мы не можем опубликовать приложение в магазине приложений, если мы используем корпоративную систему распространения Apple. - person Manu Antony; 25.09.2014

Просто трюк:

Вы можете внедрить код APNS в свой проект и получить токен устройства.

Токен устройства является уникальным. Но пользователь должен разрешить APNS.

Примечание. Токен устройства APNS изменен на Следующие причины.

  1. Изменение идентификатора пакета.
  2. Изменение режима разработки (песочница/производство)
person PREMKUMAR    schedule 23.09.2014

Я реализовал решение именно для вашей проблемы. Лучшее решение (и рекомендуемый маршрут Apple) - создать UUID, уникальный для вашего приложения, например:

    NSString *uuidString = nil;
    CFUUIDRef uuid = CFUUIDCreate(NULL);
    if (uuid) {
        uuidString = (NSString *)CFBridgingRelease(CFUUIDCreateString(NULL, uuid));
        CFRelease(uuid);
    }

Затем, и это ключ, вы можете сохранить это в связке ключей iOS (удобные классы здесь: https://github.com/lukef/IXKeychain) и значения в цепочке ключей iOS НЕ удаляются, когда пользователь удаляет приложение, поэтому вы можете сохранить свой собственный UUID во время установки приложения, что является ключевой частью управления определенным количеством устройств в зависимости от учетная запись пользователя.

person Sammio2    schedule 23.09.2014
comment
Извините, это не решит мою проблему. Скажем, у меня есть 2 устройства, и у меня есть учетные данные для входа в приложение, и мне нужно ограничить вход с устройств, которые не принадлежат мне. Для этого я реализовал механизм определения того, поступает ли запрос на вход с моего устройства или нет. Раньше для этого можно было использовать UDID устройства, но теперь это устарело. - person Manu Antony; 23.09.2014
comment
Итак, я вижу, вы хотите подготовить устройства на основе уникального идентификатора до того, как на них будет установлено приложение? Если это так, вы не сможете этого сделать. - person Sammio2; 23.09.2014
comment
Если, конечно, вы не пойдете по маршруту корпоративного распространения, как это было предложено другими ответами. - person Sammio2; 23.09.2014

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

+ (NSString *) uniqueDeviceIdentifier
  {

    NSString *deviceUUID = [[SGKeyChain defaultKeyChain] stringForKey:@"uniqueId"];

        if (!deviceUUID) {

            if (!deviceUUID.length) {

        NSString *deviceUUID = @"";

        CFUUIDRef uuidRef = CFUUIDCreate(NULL);

        CFStringRef uuidStringRef = CFUUIDCreateString(NULL, uuidRef);

        CFRelease(uuidRef);

         deviceUUID = [NSString stringWithFormat:@"%@",[NSString stringWithString:(__bridge_transfer NSString *)uuidStringRef]];

    [[SGKeyChain defaultKeyChain] setObject:deviceUUID forKey:@"uniqueId" accessibleAttribute:kSecAttrAccessibleAlways];

        }
    }       
        return deviceUUID;
    }

вы можете обратиться к этому репозиторию... https://github.com/sgup77/SGKeyChainWrapper для реализации SGKeyChain

person Sourav Gupta    schedule 23.09.2014

Хорошо, я поделюсь подходом, который мы используем для корпоративного приложения B2B. .

У каждого пользователя есть логин и пароль.

1. Таким образом, пользователь регистрирует свое устройство на сервере с помощью API deviceReg, который принимает clientDeviceId в качестве параметра (uuid, сгенерированный клиентом), а также имя пользователя и пароль.

2. Сервер возвращает сгенерированный сервером уникальный идентификатор, который будет использоваться приложением на этом конкретном устройстве.

Вывод – таким образом вы можете ограничить пользователя определенным устройством.

Вы можете использовать приведенный ниже метод для создания UUID клиента deviceSpecific.

- (NSString *)getUuid
{
    CFUUIDRef uuidRef = CFUUIDCreate(NULL);
    CFStringRef uuidStringRef = CFUUIDCreateString(NULL, uuidRef);
    CFRelease(uuidRef);
    NSString *uuid = [NSString stringWithString:(__bridge NSString *)uuidStringRef];
    CFRelease(uuidStringRef);
    return uuid;
}

Обратите внимание: я удаляю объяснение использования AuthKey, AccessToken и других, которые мы используем в целях безопасности, поскольку вы не используете какой-либо сервер аутентификации.

Я надеюсь, что это помогает.

Обновление 1.

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

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

Этот токен может быть запрошен приложением при регистрации устройства и отправлен на сервер для проверки.

Также сервер делает недействительным токен, когда-то использованный, чтобы избежать неправильного использования.

Должен быть API-интерфейс migrAtion, который использует сгенерированный сервером идентификатор устройства и токен миграции, если пользователь мигрирует устройство.

person bllakjakk    schedule 23.09.2014
comment
Спасибо, что поделились этой идеей. Но я думаю, что есть возможность зарегистрировать нежелательное устройство на человека, который знает учетные данные пользователя. Я прав ? - person Manu Antony; 23.09.2014
comment
Хотя может быть много решений для обработки этого сценария. Но вы можете использовать ВАШ сервер для отправки токена на сервер sms-шлюза, который отправляет сообщение на ваш предварительно зарегистрированный номер мобильного телефона. Токен sms, отправленный sms-сервером, будет использоваться вместе с идентификатором устройства, сгенерированным клиентом, для проверки пользователя. - person bllakjakk; 23.09.2014
comment
Мы не можем связать устройство с номером мобильного телефона, потому что мы не собираем номер мобильного телефона пользователя, а также все iPad могут не поддерживать SIM-карту :( - person Manu Antony; 25.09.2014
comment
Обновил решение. - person bllakjakk; 26.09.2014