Doc доступно только авторизованным пользователям

Авторизация в интернете — фундаментальная функция, присутствующая практически на всех сайтах. Мы сталкиваемся с ней регулярно: на форумах, в социальных сетях, на сайтах банков или в комментариях к новостям. Но какие технологии скрываются за кнопкой «Войти», знают далеко не все.

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

Напомню, что пароли пользователей не хранятся в базах данных в чистом виде. Вместо них в базах хранятся специальные буквенно-цифровые ключи. Эти ключи — результат применения к паролям специальных криптографических функций. Такие функции необратимы, и восстановить пароль по их результатам крайне сложно. Это сделано для того, чтобы в случае утечки данных злоумышленники не могли воспользоваться паролем пользователя для попытки входа в его учетные записи на других сайтах (у многих пользователей на всех сервисах установлен одинаковый пароль).

Сессия и печеньки

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

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


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

Функция «запомнить меня»

Именно благодаря механизму срока годности печенек и работает функция «запомнить меня». По умолчанию, сервис создает для пользователя сессию, истекающую в момент закрытия браузера. Но если пользователь устанавливает галочку в поле «запомнить меня», то сервер устанавливает печеньку с достаточно большим сроком годности: от месяца до нескольких лет, в зависимости от сервиса.


К сожалению, чем больше срок годности печеньки, тем выше вероятность так называемой кражи сессии: угон злоумышленником ключа сессии, хранящегося в печеньке. Угон ключа сессии позволяет злоумышленнику выполнять действия от имени пользователя. По этой причине такие сервисы, как платежные системы и личные кабинеты на сайтах банков не предоставляют механизма «запомнить меня». Более того, часто они вводят дополнительную защиту, например отправляют специальный код на мобильный телефон пользователя для подтверждения его личности.

Авторизация через сторонние сервисы

Последнее время популярным стал механизм авторизации через сторонние сервисы. На многих сайтах пользователи могут оставлять комментарии с использованием учетных записей в социальных сетях. Работает это в несколько этапов. Предположим, что пользователь уже авторизован Вконтакте. Давайте разберемся, что происходит, когда он нажимает на кнопку «Войти с помощью Вконтакте».

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

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


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

Учитывая всю информацию, изложенную в статье, можно составить список рекомендаций по безопасности для пользователей:

  1. Используйте разные пароли для разных сайтов. Конечно, помнить множество паролей очень сложно. В решении этой проблемы можно воспользоваться сервисом LastPass, о котором я писал в одной из прошлых статей .
  2. Если вы работаете с чужого компьютера, снимайте галочку с поля «запомнить меня» и нажимайте «Выход» в конце работы. Это удалит все временные данные сессии и не позволит следующему пользователю компьютера воспользоваться вашими учетными данными в своих целях.
  3. В случае авторизации с помощью соцсетей, внимательно читайте запрашиваемые сервисом-отправителем полномочия. Часто назойливые сервисы любят публиковать от вашего имени рекламу у вас на стене.

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

Привет! Сегодня мы разберем значение предупреждения: «Страница скрыта. Страница доступна только авторизованным пользователям

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

Бороться с появлением таких сайтов было невозможно и владельцы ВКОНТАКТЕ пошли на радикальные меры — открыли социальную сеть для индексации. Сразу же в яндексе и гугле появились десятки тысяч групп и миллионы пользователей. Это понравилось далеко не всем. Представьте, кто-то ввел в поиске вашу имя и фамилию и сразу же натолкнулся на профиль вконтакте, где зачастую указаны почти все персональные данные.

Поэтому было принято решение добавить в настройки приватности пункт — «кому в интернете видна моя страница» с следующими вариантами:

  • Только пользователям вконтакте
  • Всем, кроме поисковых сайтов

«Если скрыть страницу от поисковых сайтов , её нельзя будет найти в поиске по интернету. Например, в Яндексе или Google. Поисковики некоторое время хранят собранные данные. Поэтому страница исчезнет из выдачи не сразу и может быть доступна в поиске до одного месяца.»

Немного поясню. Несмотря на мощности поисковых машин, обновление выдачи происходит не сразу, а при так называемых «апдейтах». Яндексу нужно около 2-х недель, гуглу чуть меньше. Так что не стоит думать, что как только вы поставите запрет на видимость в поисковиках, то ваша страничка тут же исчезнет. Увы нет.

Все опции задаются на странице (https://vk.com/settings?act=privacy) Мои настройки —-> Приватность (вкладка прочее).



Теперь, при попытке просмотра вашей информации, неавторизованный пользователь увидит следующее сообщение:



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

Вы сможете увидеть аватарку, город, учебное заведение. Но при попытке перейти в полный профиль, все также увидите ошибку — «Страница доступна только авторизованным пользователям».

Теперь вы знаете почему вылетает такое сообщение. Хорошего дня!

Данная статья в большей части является переводом урока с официального rtfm , а именно компонента «Login», но с вставками переводчика. На лучший перевод не иду, но суть в итоге должна быть понятной. Тем не менее, перевода на русский я до сих не нашёл.
Данный урок, хоть и называется «базовым», имеет много взаимосвязанных частей. В данном уроке мы будем обсуждать, какие страницы надо создать, какие чанки (фрагменты кода) и сниппеты нужно опубликовать на страницах для полноценной авторизации пользователей.

Номера в скобках - это ID ресурсов. Это page_id, у вас он может отличаться. Здесь они выбраны просто для удобства.

Создаём нужные страницы

Перед тем, как выложим чанки с фрагментами кода, создадим пять страниц.
  • Страница входа (1): страница, содержащая форму входа
  • Сброс пароля (2): страница, где пользователи могут запросить восстановление пароля
  • Сброс пароля, обработчик (3): скрытая страница, которая будет на самом деле сбрасывать пароль. Пользователи её видеть не будут.
  • Страница только для пользователей (4): страница, содержимое которого видят только авторизованные пользователи сайта
  • Страница выхода (5): страница, на которую переадресовывается пользователь после успешного выхода
Вот так у меня выглядит дерево ресурсов в данный момент. Имейте виду, что у вас ID ресурсов будет другой. В данном примере ничего кроме страниц для компонента «Login» нету.

Дальше, нам нужно назначить правильные права для пользователей и ресурсов.

Создаём необходимые группы пользователей и группы ресурсов

MODX Revo имеет очень гибкую систему детализации прав, когда дело доходит до разрешений для пользователей, но в данной теме мы сделаем только то, что нам нужно не заходя глубоко в тему. И так, приступим.
1. Безопасность → Группы Ресурсов
Нажимаем на «Создать группу ресурсов» и называем её «Только для пользователей», например. Нажимаем «Сохранить» и всё, на данной странице больше ничего не меняем.


2. Безопасность → Контроль доступа
На первой вкладке «Группы пользователя» нажимаем на «Новая группа пользователей». Новую группу назовём «Пользователи» и нажмём «Сохранить». Группа пользователей будет иметь доступ к ресурсам «Только для пользователей». Зачем это нам, мы узнаем чуть позже в рамках этого урока.


3. На этой же странице (Безопасность → Контроль доступа ), щелкнём правой кнопкой мыши на созданную группу пользователей и выберем «Редактировать группу пользователей».



Далее переходим на вкладку «Доступ к группам ресурсов» и щёлкаем на «Добавить группу ресурсов». Для правильной работы, должны быть как минимум такие параметры:
Группа ресурсов: Только для пользователей (тот, который мы только что создали)
Минимальная роль: Member-9999
Политика доступа: Load, List and View
Контекст: web
И сохраняем.



4. Безопасность → Управление пользователями
Создаём «нового пользователя» и тем самым проверяем, как будет работать разграничение прав доступа для пользователей.
В данном случае, используйте простой логин и пароль, ибо нам, как я уже выше писал - важно убедиться в том, что новый пользователь находится в группе «Пользователи». Для этого переходим на вкладку «Права доступа» и нажимаем на «Добавить пользователя в группу».
Группа пользователя: Пользователи
Роль: Member
Затем нажимаем «сохранить» у окошка, а затем ещё раз в правом углу панели управления.



Это должно нам гарантировать, что новый пользователь может войти в систему с правами «Пользователя», чтобы смотреть страницу с правами «Только для пользователей».
Теперь вернёмся назад к страницам, дабы добавить сниппеты и фрагменты кода на соответствующие страницы.

Добавляем сниппеты на страницы

Страница входа (1)

Поместите следующий код вызова сниппета на странице входа пользователей.
[[!Login? &loginTpl=`lgnLoginTpl` &logoutTpl=`lgnLogoutTpl` &errTpl=`lgnErrTpl` &loginResourceId=`4` &logoutResourceId=`5`]]
Чанк (фрагмент кода), который отображает форму входа, должна также включать в себя ссылку на страницу с «восстановлением пароля». Разберём, что у нас в вызове формы:
&loginTpl=`lgnLoginTpl` - за форму входа отвечает чанк lgnLoginTpl, если пользователь не авторизован
&logoutTpl=`lgnLogoutTpl` - если пользователь авторизован, то ему будет выдаваться содержимое чанка lgnLogoutTpl
&errTpl=`lgnErrTpl` - при неправильном вводе данных для авторизации, или простым словом «ошибке», будет выводиться чанк lgnErrTpl
&loginResourceId=`4` - куда переадресовывать пользователя после успешной авторизации. Указано в виде ID ресурса, в данном случае 4.
&logoutResourceId=`5` - если пользователь авторизован, то при выходе будет переадресован на страницу с ID равным 5.
Так же, хочу отметить, что эти чанки стандартные, можно создать свои чанки, на любой вкус, вёрстку, и реализацию. Это предоставляет возможность выводить форму входа/выхода и прочее в любом желаемом виде, и причём, не устраивая хаоса с кодом. Стандартные шаблоны, кстати, тоже можно изменять.
Вот код, который будет отдаваться пользователям, которые ещё не авторизовались, другими словами - «форма входа». Чанк - lgnLoginTpl .
[[+errors]]
[[+actionMsg]] [[+login.recaptcha_html]]
Забыли пароль?
Вы можете поставить ссылку на «Забыли пароль» (Сброс пароля) внутри вашего шаблона и ссылаться на него по ID. В моём случае, ID ресурса с восстановлением пароля - 2.

Сброс пароля (2)

Начнём с того, что это страница чаще всего скрыта из меню. Она является в большей части формой, с помощью которой пользователи могут сбросить пароль. Тут хочется вам объяснить то, что страница со сбросом пароля (с ID 2 в моём случае), предоставляет возможность сказать о том, что пароль нужно восстановить, а сам сброс делает страница «Сброс пароля, обработчик (3)».
Вызываем форму сброса пароля следующим кодом:
[[!ForgotPassword? &resetResourceId=`3` &tpl=`lgnForgotPassTpl`]]
Разберём вызов:
&resetResourceId=`3` - страница обработчик (в моём случае с ID 3), именно она сбрасывает.
&tpl=`lgnForgotPassTpl` - чанк с кодом, в котором есть форма сброса пароля.
Чтобы понять, зачем обработчик и как это работает, предлагаю взглянуть на картинку:


Сброс пароля, обработчик (3)

Данная страница должна быть спрятана из всяких менюшек. Тем не менее, даже если ссылка на неё будет - она будет просто бессмысленная.
Суть её в следующем. Когда пользователь запрашивает сброс пароля, ему на почту приходит сообщение с этой ссылкой, а также с хэшем. Когда пользователь переходит по ссылке из почты, MODx сбрасывает пароль и переадресует пользователя на страницу с входом.
На странице обработчика, сниппет вызывается вот так:
[[!ResetPassword? &loginResourceId=`1`]] - &loginResourceId=`1` указывает, на какую страницу переадресовывать, в нашем случае на страницу с ID 1, где есть форма входа.

Страница только для пользователей (4)

Это страница, подтверждающая то, что пользователь успешно авторизовался. Содержимое данной страницы доступно только авторизованным пользователям.
Для того чтобы страница была доступна только авторизованным пользователям, нам нужно назначить для неё права. Для этого, в дереве ресурсов нажимаем на «Страницу только для пользователей». Затем, переходим на вкладку «Права доступа», там мы видим текст «Только для пользователей» и справа от него, в колонке «Доступ» видим не отмеченный чек-бокс. Отмечаем чек-бокс и нажимаем «сохранить».


Страница выхода (5)

Это страница, на которую попадают пользователи после успешного выхода из аккаунта. Страница должна содержать только основное, например сообщение с прощанием, или ссылку на форму входа. Например:

Спасибо за посещение! Возвращайтесь скорее!

Дополнительно

Страница выхода (5)

Это не является обязательным, но для тестирования и вообще, удобства при разработке, можно получить специальную ссылку для выхода. Для этого создаём «новую ссылку» (web-link) и заполняем её страницу с ID 1. Например, вызывать страницу со ссылкой вот так:
[[~1? &service=`logout`]]
Это можно использовать для выхода в таком виде:
Выйти

Возможные ошибки

После того, как мы собрали все страницы, связали их, настроили права доступа, мы должны всё проверить. Если всё работает по нашему плану, то при входе мы будет переправлены на страницу «Только для пользователей». Выйти из аккаунта мы может через страницу входа, так как, если мы авторизованы - то на странице входа появится ссылка на выход. После успешного выхода, вы должны быть переправлены на «страницу выхода».

Я не могу авторизоваться!

Обычно, такие проблемы возникают при неправильном указании ID страниц, неправильно написанных имён чанков, или пропущенных квадратных скобок. Внимательно проверьте коды.

Кроме этого, стоит помнить, что все выше написанные сниппеты должны вызываться некэшированными. Конечно, некоторые возможно будут работать в кэшированном виде, но большинство - нет. Вызывать в некэшированном виде можно с помощью восклицательного знака, например надо писать вот так:
[[!Login]]
А не так:
[]

Я не могу выйти из аккаунта!

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

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

Вопросы задавайте, если знаю ответ, несомненно помогу. Следующий урок будет переведён в свободное время. Ваши комментарии будут учтены:)
За оформление кода извиняюсь - в первый раз, а как оформлять - нигде не написано…

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

Как происходит авторизация?

Авторизация ВКонтакте ничем не отличается от любой другой авторизации через сторонний сервер. Этот процесс отлично описал пользователь StackOverflow qnub :

  1. На сервисе (в данном случае ВК) необходимо зарегистрировать приложение и получить ключ API.
  2. После этого приложение (сайт) могут делать запрос личных данных пользователя у стороннего сервиса через этот самый API, для чего:
    • перенаправить пользователя (браузер пользователя посредством посылки ему HTTP-ответа 302 Redirect) по специально сформированной ссылке на сервис предоставляющий API;
    • пользователь произведёт там какие-то действия, предположительно авторизуется и разрешит доступ к данным.
  3. По завершении действий пользователь будет перенаправлен сторонним сервисом посредством всё того же 302 Redirect на URL переданный в параметрах специально сформированной ссылки .

Шаг первый. Зарегистрировать своё приложение и получить ключ

Этот шаг самый простой. Нужно перейти на страницу ВК для разработчиков: https://vk.com/dev - и нажать на кнопку “Создать приложение”. Тип указываем как “Standalone-приложение”, имя, естественно, указываем произвольное. После этого в разделе “Мои приложения” появится (что бы вы думали?) ваше приложение. Смело нажимайте “редактировать”, затем переходите в раздел “Настройки” - там первой же строкой вы увидите надпись «ID приложения: 1234567 ». Эти цифры - всё, что вам нужно запомнить для авторизации.

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

Шаг второй. Формирование специальной ссылки

Далее вам нужно направить пользователя по специально сформированному адресу (её упоминания выделены жирным цветом в первом разделе статьи), где он подтвердит, что хочет разрешить вашему приложению выполнять какие-то действия со своим аккаунтом. Как же формируется эта ссылка?

Этот процесс подробно описан в документации . Однако, если вы обратились к этой статье, я предполагаю, что вам не хватило информации в документации, и поэтому перескажу всё своими словами. Ссылка имеет следующий вид: хост?параметры. Параметры имеют вид нескольких пар вида ключ=значение разделённых символами & .

Хост всегда остаётся неизменным: https://oauth.vk.com/authorize . Набор параметров так же неизменен:

  • client_id . Здесь стоит указать те самые цифры, которые мы добыли в первом шаге.
  • redirect_uri . Адрес, по которому будет перенаправлен пользователь. Для Standalone приложений это только https://oauth.vk.com/blank.html .
  • display . Этот параметр отвечает за то, как будет показываться страница авторизации. Доступно три варианта: page , popup и mobile . Если не уверены, используйте page .
  • scope . В этом параметре вам следует через запятую перечислить параметры доступа, которые вам необходимы. Полный список доступных параметров приведён на соответствующей странице документации. Обращаю ваше внимание, что можно не указывать вообще ничего и просто не писать этот параметр. Чтобы узнать, какие опции доступа вам нужны посмотрите в документацию методов , которые вы собираетесь использовать.
  • response_type . Указываем token и идём дальше.
  • v . Версия API. Актуальная – 5.59 .

https://oauth.vk.com/authorize?client_id=1&display=page&redirect_uri=http://example.com/callback&scope=friends&response_type=token&v=5.59

Шаг третий. Что дальше?

http://REDIRECT_URI#access_token=TOKEN 3&expires_in=TIME &user_id=ID

Нас интересует TOKEN . Как же направить пользователя на страницу из Java-приложения и как получить адрес страницы, на которую его перенаправит ВК (чтобы извлечь из неё токен)? Существует два способа.

Если вы решили пойти по этому пути, то вы просто открываете браузер системы по умолчанию с полученной выше ссылкой, а пользователю каким-то образом сообщаете, что он должен скопировать из URL токен и вставить его в какое-то поле. Понятно, что у этого метода отвратительный UX, однако его можно реализовать легко и быстро. Вполне подойдёт, если вы пишете приложение для себя - чтобы скачать музыку или получать уведомления. Реализуется он следующим образом:

Public String askToken(String link) throws IOException, URISyntaxException{ //Opens link in default browser Desktop.getDesktop().browse(new URI(link)); //Asks user to input token from browser manually return JOptionPane.showInputDialog("Please input access_token param from browser: "); }

Буржуазный, через веб-компоненты

Если вы решили пойти по этому пути, то вам потребуется использовать какую-либо стороннюю GUI-библиотеку (или по крайней мере JavaFX), у которой в арсенале есть свой компонент браузера. Над таким бразуером ваша программа будет иметь полную власть, и вы сможете извлечь адрес, на который вас перенаправил ВК, программными средствами. На JavaFX это можно реализовать следующим образом:

Import javafx.application.Application; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.scene.Scene; import javafx.scene.web.WebEngine; import javafx.scene.web.WebView; import javafx.stage.Stage; public class Main extends Application{ public static final String REDIRECT_URL = "https://oauth.vk.com/blank.html"; public static final String VK_AUTH_URL = ""; //TODO!!! public static String tokenUrl; public static void main(String args){ System.out.println(Main.getTokenUrl()); } public static String getTokenUrl(){ launch(Main.class); return tokenUrl; } @Override public void start(Stage primaryStage) throws Exception { final WebView view = new WebView(); final WebEngine engine = view.getEngine(); engine.load(VK_AUTH_URL); primaryStage.setScene(new Scene(view)); primaryStage.show(); engine.locationProperty().addListener(new ChangeListener(){ @Override public void changed(ObservableValue observable, String oldValue, String newValue) { if(newValue.startsWith(REDIRECT_URL)){ tokenUrl=newValue; primaryStage.close(); } } }); } }

Заключение

Таким образом, мы научились получать access token ВКонтакте, с помощью которого можно вызывать методы API. Если эта статья вызовет у сообщества интерес, в следующей статье я опишу, как вызывать те или иные API-методы с помощью токена, как проверять токен на валидность (метод secure.checkToken() , конечно), и напишу какое-нибудь демонстрационное приложение, например, для сохранения всей музыки из плейлиста на компьютер. Кстати, не стоит забывать, что на самом деле всё придумано до нас, и уже есть библиотеки для работы с VK API почти для любого языка. У нас есть , в которой мы постарались собрать лучшие из них.

Если есть какие-то идеи или вопросы - добро пожаловать в комментарии (я их читаю и всем отвечаю). Так же вопросы можно задать



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: