Я пытаюсь создать фрагмент сценария PHP, который будет однозначно идентифицировать мобильное устройство, используя HTTP-запрос, отправляемый на сервер при вызове страницы.
Я знаю что есть UNIQUE_ID
в $_SERVER
Однако это случайная строка, генерируемая уникально для каждого запроса, а не для каждого устройства. Пока что похоже, что HTTP-запрос настроен таким образом, чтобы не допустить того, что я делаю, чтобы серверы не могли отслеживать пользователей без их согласия.
Проблема в том, что мне нужен способ идентифицировать устройство, чтобы оно загружало правильный дисплей киоска, который хранится в моей базе данных. IP-адрес невозможен, потому что я настрою устройство в своем офисе, а затем отправлю его по назначению, и в этом случае IP-адрес изменится.
Я мог бы использовать печенье и UNIQUE_ID
при первой загрузке страницы, но если история удаляется, устройство перестает быть связанным с его предыдущей настройкой.
Я думал о создании собственной случайной строки, чтобы, если установка была стерта, пользователь мог просто ввести строку, чтобы заново связать ее, но вся идея заключается в том, что я пытаюсь полностью избежать ввода пользователя.
Другой вариант — использовать SureFox для удаленного управления моими устройствами, но я стараюсь сохранить как можно больше контроля.
Любые идеи о том, как я мог бы однозначно идентифицировать устройство в PHP каждый раз, когда он запрашивает страницы с сервера?
Единственная часть информации, которая может быть сохранена после сброса истории Агент пользователя строка. Это работает, если у вас есть контроль над устройством (как в вашем случае) и вы можете настроить конфигурацию браузера для использования пользовательской строки user-agent (способ ее установки зависит от браузера).
Никакой другой информации, которую сам браузер предоставляет, может однозначно идентифицировать устройство (куки могут быть сброшены / потеряны, изменения IP, никакие другие заголовки не отправляются браузером автоматически).
Альтернативный подход может состоять в том, чтобы иметь пользовательскую ссылку / команду, которая запускает браузер для включения идентификации устройства в URL в виде строки запроса. Более экстремально — пользовательский локальный прокси-сервер (то есть может моделироваться с помощью Fiddler), который добавляет пользовательские заголовки ко всем запросам.
Ну, после укуса и скрежета зубов, я понял это благодаря эта почта, эта почта, а также эта почта.
Я создал файл с именем UDID_request.mobileconfig
, Это выглядит так:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PayloadContent</key>
<dict>
<key>URL</key>
<string>http://kiosk.mydomain.com/setup/index.php</string>
<key>DeviceAttributes</key>
<array>
<string>UDID</string>
<string>IMEI</string>
<string>ICCID</string>
<string>VERSION</string>
<string>PRODUCT</string>
</array>
</dict>
<key>PayloadOrganization</key>
<string>mydomain.com</string>
<key>PayloadDisplayName</key>
<string>Profile Service</string>
<key>PayloadVersion</key>
<integer>1</integer>
<key>PayloadUUID</key>
<string>9CF421B3-9853-4454-BC8A-982CBD3C907C</string>
<key>PayloadIdentifier</key>
<string>com.mydomain.kiosk.profile-service</string>
<key>PayloadDescription</key>
<string>This temporary profile will be used to find and display your current device's UDID.</string>
<key>PayloadType</key>
<string>Profile Service</string>
</dict>
</plist>
Далее я создал /setup/index.php
:
<?php
$data = file_get_contents("php://input");
file_put_contents("udidlog.txt", $data);
header('Location: http://kiosk.mydomain.com', true, 301);
?>
Затем я указал браузер Safari на своем iPad на .mobileconfig
файл, который я создал ранее. Это привело меня к окну установки сертификата профиля. Я нажал «Установить», подтвердил установку неподписанного сертификата и отправил ответ на /setup/index.php
, который скопировал ответ на мой udidlog.txt
файл, а затем перенаправлен на мою домашнюю страницу киоска.
Это было нелегко. Это было, по словам одного из постов, привередливым. Ответы не передавались до тех пор, пока у меня не было правильных перенаправлений и т. Д.
Ответ, который я получаю, перемешивается с подписанием сертификата, но важная часть XML находится в виде простого текста, поэтому я извлек XML, используя:
function extract_xml_from_plist($data) {
$sTag = "<?xml";
$eTag = "</plist>";
$startsAt = strpos($data, $sTag);
$endsAt = strpos($data, $eTag, $startsAt) + strlen($eTag);
$result = substr($data, $startsAt, $endsAt - $startsAt);
return new SimpleXMLElement($result);
}
$xml = extract_xml_from_plist($file);
Вот XML из ответа, который я получил:
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>ICCID</key>
<string>8901 4104 2541 8901 7521</string>
<key>IMEI</key>
<string>01 266900 647352 2</string>
<key>PRODUCT</key>
<string>iPad2,2</string>
<key>UDID</key>
<string>591f30d41d0bd28597ad962491f1570ddbde4a8a</string>
<key>VERSION</key>
<string>9J2</string>
</dict>
</plist>
Теперь, используя $xml->dict->key[n]
а также $xml->dict->key[n]
Я создал ассоциативный массив атрибутов устройства, возвращаемых устройством по моей просьбе. Теперь у меня есть уникальный идентификатор, который всегда будет одинаковым для этого устройства, и я могу использовать его для создания своего рода файла cookie для входа. Когда печенье стирается? Просто перенаправьте и получите UDID снова! Нет логинов, паролей, все настройки в моей базе данных, прежде чем она покинет мое здание. Прикольные вещи.
Что касается Android, кажется, что MDM гораздо менее централизован. Существует множество серверов MDM, но я думаю, что более простым решением было бы использовать уже разработанную программу управления киосками, такую как SureFox, а не изобретать велосипед. Хотя это не совсем отвечает на мой вопрос в отношении Android UDID, оно работает для моего решения, и с деньгами, которые я бы сэкономил на покупке планшетов Android вместо iPad, более чем стоит платить за несколько лицензий.