freeCodeCamp/curriculum/challenges/russian/06-information-security-and.../advanced-node-and-express/implementation-of-social-au...

6.8 KiB
Raw Blame History

id title challengeType videoUrl localeTitle
589a69f5f9fc0f352b528e70 Implementation of Social Authentication 2 Реализация социальной аутентификации

Description

Напомним, что этот проект строится на следующем стартовом проекте Glitch или клонируется из GitHub . Основной путь такого рода аутентификации будет следовать в вашем приложении:
  1. Пользователь нажимает кнопку или ссылку, отправляя их на наш маршрут для аутентификации с использованием определенной стратегии (EG. GitHub)
  2. Ваш маршрут требует passport.authenticate('github') который перенаправляет их в GitHub.
  3. Страница, на которую пользователь приземляется, на GitHub, позволяет им войти в систему, если они еще не были. Затем он просит их одобрить доступ к своему профилю из нашего приложения.
  4. Затем пользователь возвращается в наше приложение с определенным URL-адресом обратного вызова с их профилем, если он одобрен.
  5. Теперь они аутентифицированы, и ваше приложение должно проверить, является ли он возвращаемым профилем, или сохранить его в своей базе данных, если это не так.
Стратегии с OAuth требуют наличия, по крайней мере, идентификатора клиента и секретности клиента, который позволяет проверить, откуда идет запрос на аутентификацию, и если он действителен. Они получены с сайта, на котором вы пытаетесь внедрить аутентификацию с помощью, например, GitHub, и являетесь уникальными для вашего приложения. ОНИ НЕ РАЗМЕЩАЮТСЯ и никогда не должны загружаться в общедоступный репозиторий или записываться непосредственно в ваш код. Обычная практика заключается в том, чтобы поместить их в ваш .ENV- файл и ссылаться на них так: process.env.GITHUB_CLIENT_ID . Для этой задачи мы собираемся использовать стратегию GitHub. Получение идентификатора клиента и секретности из GitHub выполняется в настройках профиля вашего аккаунта в разделе «Настройки разработчика», а затем « Приложения OAuth ». Нажмите «Зарегистрировать новое приложение», назовите свое приложение, вставьте URL-адрес на свою страницу с глюком ( не URL-адрес кода проекта ) и, наконец, URL-адрес обратного вызова, вставьте тот же URL-адрес, что и на главной странице, но с помощью «/ auth / github / callback '. Здесь пользователи будут перенаправлены на нас для обработки после проверки подлинности на GitHub. Сохраните возвращаемую информацию как «GITHUB_CLIENT_ID» и «GITHUB_CLIENT_SECRET» в вашем .ENV-файле. В вашем ремикс-проекте создайте 2 маршрута, принимающих запросы GET: / auth / github и / auth / github / callback. Первый должен только называть паспорт для аутентификации «github», а второй должен вызывать паспорт для аутентификации «github» с перенаправлением отказа на «/», а затем, если это успешно перенаправляется на «/ profile» (аналогично нашему последнему проекту). Пример того, как выглядит '/ auth / github / callback', аналогичен тому, как мы обрабатывали обычный логин в нашем последнем проекте:
 app.route ( '/ Войти')
  .post (passport.authenticate ('local', {failRedirect: '/'}), (req, res) => {
    res.redirect ( '/ профиль');
  }); 
Представьте свою страницу, когда вы думаете, что у вас все в порядке. Если вы работаете в ошибки, вы можете проверить проект до этого момента здесь .

Instructions

Tests

tests:
  - text: Правило маршрута / auth / github
    testString: 'getUserInput => $.get(getUserInput("url")+ "/_api/server.js") .then(data => { assert.match(data, /("|")\/auth\/github("|")[^]*get.*passport.authenticate.*github/gi, "Route auth/github should only call passport.authenticate with github"); }, xhr => { throw new Error(xhr.statusText); })'
  - text: Правило маршрута / auth / github / callback
    testString: 'getUserInput => $.get(getUserInput("url")+ "/_api/server.js") .then(data => { assert.match(data, /("|")\/auth\/github\/callback("|")[^]*get.*passport.authenticate.*github.*failureRedirect:( |)("|")\/("|")/gi, "Route auth/github/callback should accept a get request and call passport.authenticate for github with a failure redirect to home"); }, xhr => { throw new Error(xhr.statusText); })'

Challenge Seed

Solution

// solution required