ADN Open CIS
Сообщество программистов Autodesk в СНГ

11/01/2016

Использование Entitlement API из надстройки Fusion

Если у вас есть приложение в Autodesk App Store то вы, возможно, захотите проверить, заплатил ли на самом деле пользователь за свое приложение и скачал из магазина или просто скопировал его с чужого компьютера. В этом вам может помочь Entitlement API

В сентябрьском выпуске Fusion API были введены два новых пользовательских свойства в Application object: userName и userId. Последний необходим, для того, чтобы воспользоваться Entitlement API.

Возможно, имеет смысл использовать этот API из надстройки C++, так как она гораздо лучше защищена благодаря компиляции. Описанном выше будет детально рассматриваться в статье.

Entitlement API является простым RESTful API, где вам нужно просто отправлять HTTP-GET запросы к серверу App Store, чтобы получить всё что вам нужно. Используемая библиотека может быть выбрана на ваше усмотрение, поскольку тут есть много вариантов. Я стал искать кроссплатформенную библиотеку, поскольку Fusion поддерживает как Mac, так и Windows. Однако те, которые я пробовал, были очень сложны в использовании. В конце концов, я решил работать с библиотекой cURL, которая действительно проста в использовании из надстройки для MacOS.

Шаги, которые необходимо предпринять:

1) Создать новую надстройку Fusion на C++:

 

 

2) Добавить поддержку cURL в вашу надстройку:

Когда как вы находитесь в Xcode, идите в Project settings и под "Build Settings >> Linking >> Other Linker Flags" добавьте "-lcurl"

 

3) Добавьте следующие объявления в верхней части файла C++:

Код - C++: [Выделить]
  1. #include <curl/curl.h>
  2. #include <regex>
  3.  
  4. using namespace std;

4) Кроме того, добавьте этот код, который использует библиотеку регулярных выражений: (есть немало тестеров регулярных выражений в Интернете, которые вы можете использовать – я использовал следующий: https://www.myregextester.com/index.php)

Код - C++: [Выделить]
  1. // Получить значение данного свойства
  2. // внутри текста JSON
  3. string GetValue(string text, string find)
  4. {
  5.   regex IsValid("\\s*\"" + find + "\"\\s*:\\s*(.+?)[\\s,]");
  6.   smatch m;
  7.  
  8.   if (regex_search(text, m, IsValid))
  9.   {
  10.     if (m.size() > 1)
  11.       return m[1];
  12.   }
  13.  
  14.   return "";
  15. }
  16.  
  17. size_t callback_func(void *ptr, size_t size, size_t count, void *stream)
  18. {
  19.   // ptr - ваша переменная типа string.
  20.   // stream - блок данных, который вы получили
  21.  
  22.   string reply((char*)ptr);
  23.   string ret = GetValue(reply, "IsValid");
  24.  
  25.   // Если приложение не является допустимым
  26.   if (ret != "true")
  27.     ui->messageBox("IsValid = false");
  28.   else
  29.     ui->messageBox("IsValid = true");
  30.    
  31.   return 0;
  32. }
  33.  
  34. // Используем Entitlement API, чтобы проверить,
  35. // является ли использование приложения полномочным
  36. void CheckValidity()
  37. {
  38.   // Например, URL для приложения Voronoi Sketch generator:
  39.   // https://apps.autodesk.com/FUSION/en/Detail/Index?id=appstore.exchange.autodesk.com%3avoronoisketchgenerator_macos%3aen
  40.   // Он содержит "id":
  41.   // "appstore.exchange.autodesk.com%3avoronoisketchgenerator_macos%3aen"
  42.   // Так что мы можем использовать его
  43.   string userId = app->userId();
  44.   string userName = app->userName();
  45.   string appId =
  46.     "appstore.exchange.autodesk.com%3aaddinrename_windows32and64%3aen";
  47.   string url =
  48.     string("https://apps.exchange.autodesk.com/webservices/checkentitlement") +
  49.     string("?userid=") + userId +
  50.     string("&appid=") + appId;
  51.  
  52.   CURL * curl = curl_easy_init();
  53.   if(curl) {
  54.     CURLcode res;
  55.     curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
  56.     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback_func);
  57.     res = curl_easy_perform(curl);
  58.     curl_easy_cleanup(curl);
  59.   }
  60. }

5) Теперь вы можете вызвать CheckValidity() изнутри вашей функции run()

Вы можете легко выяснить id вашего приложения, найдя его в App Store, а затем анализируя его URLв браузере. Этот адрес будет содержать необходимый вам id параметр. Например, версия Voronoi Sketch Generator для MacOS на английском,имеет следующий URL, и в нём подчеркнута важная роль id:
https://apps.autodesk.com/FUSION/en/Detail/Index?id=appstore.exchange.autodesk.com%3avoronoisketchgenerator_macos%3aen

 

Стоит отметить, что Entitlement API предоставляет информацию только о том, заплатил ли пользователь за приложение, но не сообщает, было ли бесплатное приложение загружено данным пользователем из магазина. 

Так что, когда эта функциональность используется по отношению к бесплатным приложениям, то IsValid всегда будет возвращать false:

 

Но если осуществить проверку платного приложения, за которое я заплатил, я получу значение true:

 

Поскольку Entitlement API основан на простых HTTP- запросах, вы можете легко проверить его в утилитах, как RESTClient для Firefox.

 

Вы можете найти полный исходный код здесь: https://github.com/AutodeskFusion360/EntitlementAPI.
В настоящее время пример содержит код только под MacOS. Однако, скорее всего, позже будет добавлена Windows версия.

Источник: http://modthemachine.typepad.com/my_weblog/2015/10/use-entitlement-api-from-fusion.html 

Автор перевода: Дмитрий Емельянов

Обсуждение: http://adn-cis.org/forum/index.php?topic=3333

Опубликовано 11.01.2016