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

Однако эти данные не принадлежат вам. Он существует во множестве разрозненных хранилищ в различных сервисах, веб-сайтах и ​​приложениях, которые вы используете, и, хотя вы можете получить доступ к этим данным через запрос GDPR (или аналога за пределами ЕС), вы не получите все данные, которые компания хранит о вас, просто данные, которые подпадают под юридические обязательства компаний.

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

Мастодонт, наверное, самый известный из этих децентрализованных сервисов. Любой может присоединиться к экземпляру Mastodon (или запустить свой собственный), публиковать и получать сообщения из fediverse, который представляет собой объединенный поток обновлений от других экземпляров Mastodon, которые сопровождающий сервера курирует для своего сообщества.

Технология, лежащая в основе Mastodon, называется ActivityPub, стандарт W3C для объединения контента в социальной сети. Он отлично работает для этой цели, но что, если вам нужна децентрализованная версия чего-то более личного, например данных, которые используют ваши приложения? Это проблема, которую Solid пытается решить.

Краткое введение в Solid

Solid возглавляет Тим ​​Бернерс-Ли (вы, возможно, знаете его как человека, который изобрел всемирную паутину) и нацелен на децентрализацию хранения пользовательских данных.

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

Данные пользователя хранятся в модуле, доступ к которому осуществляется с помощью WebID, по сути документа, который содержит информацию о пользователе и его предпочтения по совместному использованию.

Модуль, в котором хранятся данные пользователя, и WebID могут быть отдельными службами (для еще большей децентрализации), но если вы только начинаете работать с Solid, вероятно, вы будете использовать одного и того же провайдера для обоих.

Когда пользователь использует приложение Solid, он входит в систему со своим WebID и предоставляет приложению доступ к данным пользователя (доступны разные разрешения доступа), и, если приложение может, делиться данными этого пользователя.

После авторизации для доступа к данным пользователя в модуле приложение может затем использовать интерфейс RESTful для чтения, записи и удаления данных в модуле (в зависимости от уровня предоставленного доступа).

Как Solid хранит данные

Данные в модуле хранятся в виде связанных данных (Solid - это портмоне связанных данных из социальных сетей), по общему признанию, у меня ограниченные знания о связанных данных и RDF, но это достаточно простой формат для восприятия.

Ресурсы, используемые приложениями в Solid, хранятся в документах Turtle, имеющих одну или несколько тем.

У субъектов в документе есть свойства (называемые литералами в спецификации Turtle), которые определяют этот субъект. Эти свойства могут быть простыми атрибутами, такими как имя, или отношениями между разными предметами в одном или нескольких документах.

Формат определения обоих субъектов - subject, predicate, object тройка, например, если субъект определен как :colin a foaf:Person, это означает, что субъектом является человек, как определено схемой «Друг друга».

Свойства объекта определяются в формате property value, например foaf:name Colin, что сначала может показаться немного странным, но есть определенные классы свойств, которые упрощают выполнение вычислений на основе графиков, например, те, которые генерируют список людей. субъект знает, используя свойство foaf:knows.

Создание приложения с помощью Solid

Когда я впервые нашел Solid, мне было очень приятно видеть, что существует множество приложений, которые опубликовали свой исходный код, что является отличной отправной точкой для понимания процесса аутентификации и того, как создавать, читать, обновлять и удалять (CRUD) ресурсы с помощью Solid.

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

Однако я обнаружил, что реализация библиотеки @solid/react немного сбивает с толку, поскольку в ней используются JavaScript Proxys и выражения LDFlex (то, с чем я изо всех сил пытался использовать настраиваемые объекты), которые, по ощущениям, больше ориентированы на чтение документа, чем на чтение и написание документа и его темы.

В конце концов я нашел Tripledoc, который мне показался очень простым в использовании, поскольку он следует за документом - ›тема -› структура свойств, которая позволяет выполнять операции CRUD на каждом уровне этой иерархии.

Я создал демонстрационный проект с использованием Solid, который вы можете использовать, чтобы лучше понять Solid и Tripledoc, и я расскажу подробнее ниже.



Аутентификация

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

Этот процесс аутентификации обычно выполняется во всплывающем окне в веб-браузере. Solid предоставляет отличную библиотеку для аутентификации пользователя таким способом под названием solid-auth-client, в которой есть удобный инструмент CLI, используемый для генерации файла HTML, чтобы отобразить пользователя для этого.

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

Работа с документами

Чтение документа с tripledoc выполняется функцией fetchDocument.

Эта функция берет путь к ресурсу (например, https: //host.tld/public/file) и возвращает документ, если он найден.

Это вызовет ошибку, если документ не найден, поэтому я использовал createDocument функцию tripledoc, чтобы вернуть пустой документ по тому же пути, если документ еще не существует.

В библиотеке tripledoc нет средств для удаления документа, но вы можете отправить HTTP-запрос DELETE на URI ресурса, который удалит ресурс.

Работа с темами документа

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

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

Если вам известен идентификатор темы, вы можете использовать метод getSubject документа, который принимает идентификатор, включая префикс #.

Если вы хотите использовать один из предикатов на основе графа для поиска субъектов (таких как поиск субъектов, которые знают данный предмет), вы можете сделать это с помощью методов findSubject и findSubjects соответственно.

Вы можете создать тему, используя метод addSubject документа, который принимает объект параметров, причем наиболее важным свойством, которое нужно установить, является свойство identifier, поскольку оно будет определять идентификатор, под которым будет храниться новая тема. Если идентификатор не передан, субъект будет использовать случайный UUID в качестве идентификатора.

В отличие от документов, вы можете использовать tripledoc для удаления темы из документа с помощью функции документа removeSubject, которая принимает в качестве аргумента идентификатор темы (с префиксом #).

Чтобы внести какие-либо изменения на основе темы в модуль пользователя, вам необходимо вызвать save метод документа.

Работа со свойствами предмета

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

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

Субъектный объект поддерживает следующие типы данных:

  • DateTime
  • Десятичный
  • Целое число
  • LocaleString
  • Ссылка
  • Нить

И следующие операции для каждого типа данных

  • добавить - создает новый экземпляр этого типа данных для предоставленного предиката.
  • get - получает экземпляр этого типа данных в соответствии с заданным предикатом.
  • remove - удаляет экземпляр этого типа данных в соответствии с заданным предикатом.
  • set - удаляет существующий экземпляр этого типа данных в указанном предикате и добавляет новый.

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

Использование Tripledoc в приложении React

Это просто пример того, как я использовал tripledoc в своем приложении React. Возможно, вам будет проще работать с tripledoc-react библиотекой, но мне нравится отделять свои логические функции от компонентов, поэтому я решил просто использоватьtripledoc.

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

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

Для обработки аутентификации я использую функцию solid-auth-client ‘s popupLogin, чтобы загрузить popup.html, который мне предоставила библиотека, с помощью ее команды CLI. Когда пользователь входит в систему и получает его WebID, он сохраняется в состоянии приложения.

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

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

После сохранения документа я отправляю и обновляю темы, хранящиеся в состоянии приложения.

Благодаря Tripledoc использование модуля Solid в вашем приложении React ничем не отличается от использования любого другого API REST.

Единственные отличия от процесса разработки:

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

Резюме

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

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

Переносимость данных, которые Solid предоставляет пользователю, представляет для меня большой интерес, поскольку я всегда чувствовал, что открытие API-интерфейсов для использования разработчиками позволяет экосистемам возникать вокруг продуктов (это одна из вещей, которые, я думаю, Pokemon Go действительно упустил. при первом запуске).

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

Я также думаю, что средства управления доступом, предоставляемые Solid, могут быть слишком мягкими, поскольку вы, по сути, предоставляете доступ ко всем документам в модуле приложению. Можно было бы привести аргумент, что люди будут использовать разные модули для разделения частной и общедоступной информации, но это неудобно для пользователей (и, следовательно, маловероятно), и в конечном итоге это будет использовано злоумышленниками.

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

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

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

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

Помимо забот о безопасности, я действительно думаю, что Solid - это отличная технология, и я действительно с нетерпением жду возможности увидеть, как она будет развиваться и внедряться в течение следующего десятилетия, и как она формирует Интернет.