
Аутентификация — это процесс доказательства того, что что-то является истинным, подлинным или действительным. Таким образом, реализация аутентификации Facebook полагается на Facebook для «аутентификации» тех, кто использует ваше приложение. У Facebook, вероятно, больше ресурсов, чем у вас. Когда дело доходит до аутентификации пользователей приложения в стиле социальных сетей (то есть важно, чтобы пользователи были теми, кем они себя называют), нет причин изобретать велосипед. Конечно, это не абсолютная наука, и Facebook не может гарантировать, что пользователи являются теми, за кого себя выдают. В любом случае, Facebook максимально приблизит вас к точной аутентификации, не тратя денег на услугу и написав всего несколько строк кода. Я покажу вам один способ эффективной реализации аутентификации facebook в приложении nodeJS с использованием двух пакетов npm: passport-facebook-token и jsonwebtoken.
Я расскажу о процессе в 5 шагов:
- создать приложение на сайте developer.facebook.com
- импортировать зависимости в ваше приложение
- написать код для промежуточного программного обеспечения
- обрабатывать маршрутизацию
- безопасные маршруты и идентификация пользователей с помощью JWT
Шаг 1. Создайте приложение на сайте developer.facebook.com.

Если вы требуете, чтобы у пользователей была учетная запись Facebook, логично, что разработчику также потребуется учетная запись Facebook. Перейдя по адресу developers.facebook.com, вы можете создать новое приложение на панели инструментов. В верхнем левом углу экрана появится раскрывающееся меню, в котором будет показан список ваших текущих приложений, и вы сможете создать новое приложение. Facebook предлагает учебные пособия, которые помогут реализовать аутентификацию, но мы собираемся импортировать некоторые другие библиотеки, чтобы сделать процесс еще более эффективным.
Шаг 2. Импорт зависимостей в ваше приложение
Сначала нам понадобится Facebook SDK (Software Development Kit). Из index.html на верхнем уровне приложения вы можете вставить следующий тег скрипта внутрь ‹head›:

В настоящее время я не собираюсь больше рассказывать о внешнем интерфейсе. Однако, как только сервер реализован правильно. Внешний интерфейс — это вопрос управления потоком и выполнения вызовов на сервер в нужное время. Наблюдение за вызовом сервера не будет полезным, если оно находится за пределами более широкого контекста, в котором он находится в вашем приложении. Таким образом, я выделю надежный процесс аутентификации в бэкенде, который можно использовать для управления потоком вашего приложения на стороне клиента.
Я буду использовать три пакета npm для выполнения тяжелой работы на серверной части: passport, password-facebook-token вместе с jsonwebtoken. Эти пакеты можно установить и сохранить в файл package.json с помощью следующих команд в терминале из корневого каталога вашего приложения:



Шаг 3: Напишите код для промежуточного программного обеспечения
Теперь, когда промежуточное ПО установлено. Я могу импортировать их на сервер NodeJS с помощью Express:

Теперь мы можем реализовать FacebookTokenStrategy:

Приведенная выше стратегия требует clientID и clientSecret. Их можно найти на сайте developer.facebook.com. На панели инструментов приложения (ранее созданной выше) вы можете получить доступ к идентификатору и секрету, нажав «Основные» в раскрывающемся меню «Настройки» в левой части экрана:

Вам нужно будет указать отображаемое имя, домен приложения и контактный адрес электронной почты. Самое главное — это домен приложения. Только запросы из указанных здесь доменов будут аутентифицировать пользователей. Во время разработки localhost будет достаточно. Однако после развертывания необходимо указать домен развернутого приложения.
После аутентификации Facebook ответит общедоступным профилем пользователя и адресом электронной почты в соответствии с областью, которую я определил (которая будет рассмотрена на следующем шаге). То, что вы делаете с этой информацией, относится к функциональности вашего конкретного приложения. Здесь я вызываю вспомогательную функцию из импортированного файла. Эта функция создает нового пользователя, если этот пользователь еще не существует. Обрисованный в общих чертах объект, который передается в addNewUser, указывает на информацию, которую я получаю от facebook.
Шаг 4: Обработка маршрутизации
Затем нам нужно установить маршрут для реализации стратегии, определенной выше. Я установил конечную точку «/auth/facebook», но это может быть что угодно, если запрос от клиента направляется в правильную конечную точку:

Паспорт используется для реализации стратегии «facebook-токен». Затем идентификатор пользователя Facebook используется для создания JWT (веб-токена JSON). Закодированный токен содержит секрет: «секрет». Следовательно, для декодирования токена необходимо предоставить «секрет». Кроме того, я установил срок действия токена через один час. Наконец, токен возвращается клиенту.
Шаг 5. Защитите маршруты и идентифицируйте пользователей с помощью JWT
На этом процесс настройки сервера NodeJS для аутентификации пользователей с помощью Facebook завершен. Однако если вы также разрабатываете маршруты, которые доставляют конфиденциальные данные отдельным пользователям, JWT можно использовать для обеспечения безопасности этой информации и связывания правильных данных с нужным пользователем. В приведенном ниже примере требуется, чтобы любой маршрут, предоставляющий конфиденциальную информацию, содержал JWT пользователя в качестве параметра. Все запросы с этим параметром будут сначала аутентифицированы до обработки фактического маршрута. Если аутентификация не удалась, запрос будет немедленно отклонен. Если аутентификация прошла успешно, запрос будет направлен соответствующим образом:

Любой маршрут, который вы хотите защитить, требуя JWT, может использовать конечную точку «/: token» для запуска функции router.param:

Любые вызовы ‘/api/currentUser/:token’ будут авторизованы до выполнения функции обработки маршрута. И это завершает аутентификацию пользователей с помощью Facebook и защиту/идентификацию пользовательских данных с помощью веб-токенов JSON. Я надеюсь, что эта информация окажется полезной! Удачного кодирования!
