Паспорт нод: Паспорт НОД по художественно – зстетическому развитию “Золотая Осень” в старшей группе.

Содержание

Паспорт НОД по художественно – зстетическому развитию “Золотая Осень” в старшей группе.

МУНИЦИПАЛЬНОЕ БЮДЖЕТНОЕ ДОШКОЛЬНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

«Детский сад общеразвивающего вида № 50»

НОД

«Золотая Осень»

в старшей группе

(художественно-эстетическое развитие)

Воспитатель 1 категории:

Сакина И.В.

Иваново, 2017г.

2. Нетрадиционное, интегрированное, комплексное.

Предмет: Художественно эстетическое развитие (лепка)

  • Номер занятия по данной теме, место занятия в изучении темы: №1 , на этом занятии закрепляется умение лепить грибы, и происходит обогащение словарного запаса детей

  • Цель занятия: закреплять умение лепить предметы или их части круглой, овальной, дискообразной формы, пользуясь движением всей кисти и пальцев; учить передавать некоторые характерные признаки: углубление, загнутые края (шляпка грибов), утолщающиеся ножки; развивать координацию речи с движением, творческое воображение, закрепить в речи глагол «искать» , имена прилагательные «проливной», «кленовый».

  • Задачи занятия:

Познавательное развитие:

– развивать интерес, любознательность и познавательную мотивацию;

– развивать умственную и творческую активность;

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

Речевое развитие

-обогащать и активизировать словарный запас детей;

-побуждать детей использовать в своей речи прилагательные, глаголы и наречия;

– продолжать учить детей отвечать на вопросы полным предложением;

– выразительно читать стихотворения.

Физическое развитие

-развивать мелкую моторику кистей рук.

Социально-коммуникативное развитие

– прививать любовь к природе;

Художественно-эстетическое развитие:

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

-наборы пластилина по количеству детей,

– доски для лепки по количеству детей,

-магнитная доска,

-интерактивная доска,

– презентация на тему «Любимая Осень»,

– развивающий мультфильм «Уроки тётушки Совы «Про грибы»»

-магнитофон,

-плакаты,

– аудиозаписи.

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

Ход занятия.

Деятельность педагога с указанием номера слайда

Деятельность воспитанника

  1. Этап занятия.

Вхождение 5 минут

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

Цель этапа: Организация и настрой на занятие.

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

ИКТ ролик на тему осень.

Воспитатель: Ребята, здравствуйте.

На улице сейчас осенний период года, это время всегда нравилось поэтам, художникам. А вам нравится осень?

– Как вы думаете, а какое настроение у осени?

Правильно, оно может быть разным и задумчивым, и нежным, и радостным. Но особенно красив осенний лес.

Воспитатель: Давайте встанем все в круг, друг другу улыбнёмся. Пусть сегодняшней осенний день будет радостным и веселым.

Давайте подуем на листочки с ладошки.

Слайд № 3, Слайд № 4

Воспитатель: Давайте присядем на стульчики и попробуем оказаться в осеннем лесу. Закройте глазки. Представьте лес, в котором тепло и солнечно, как летом. Послушайте, как ветер качает листочки. Вот солнечный зайчик играет с нами в прятки. Здесь замечательно и тихо.

Воспитатель: Представили?

А теперь откройте глазки.

Вам понравилось в этом лесу?

А грибочки там были?

Здравствуйте!

Ответы детей.

Ответы детей.

Движения детей.

Ответы детей.

Ответы детей.

  1. Этап занятия.

Основной. 15 минут

Цель этапа: – в процессе включения воспитанников в активную познавательную деятельность через использование различных педагогических технологий воспроизвести необходимые для овладения новым материалом знания детей;

-активное мотивирование на новый материал;

– развитие речи, как интеллектуального и общего развития воспитанника через представление собственных знаний;

– развитие эмоциональной сферы воспитанников через применение активных форм ведения занятия.

Объяснение нового материала.

Методы организации работы:

– мозговой штурм;

– развивающая подвижная игра;

-наблюдение;

– лепка.

Цель этапа:

Воспитанники актуализируют знания, отвечают на вопросы, обобщают, творят.

Воспитатель: Давайте ещё раз повторим признаки осени. Игра с мячом малой подвижности.

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

Воспитатель: Молодцы!

Художественное слово:

Осень

Падают, падают листья –

В нашем саду листопад…

Желтые, красные листья

По ветру вьются, летят.

Птицы на юг улетают –

Гуси, грачи, журавли.

Вот уж последняя стая

Крыльями машет вдали.

В руки возьмем по корзинке,

В лес за грибами пойдем,

Пахнут пеньки и тропинки

Вкусным осенним грибом.

Слайд № 5

Воспитатель:

Физкультминутка:

Все зверушки на опушке

Ищут грузди и волнушки.

Белочки скакали.

Рыжики искали.

Лисичка бежала

Лисички собирала.

Скакали зайчатки

Искали опятки.

Медведь проходил

Мухомор раздавил.

Слайд № 6

Воспитатель: Молодцы!

Воспитатель: Ребята, вы сейчас замечательно показали, как грибы собирать можно! А давайте попробуем их слепить?

Какие названия грибов вы знаете?

Воспитатель: Ребята сейчас я вам расскажу о съедобных и не съедобных грибах.

БЕЛЫЙ ГРИБ — шляпка коричневая, круглая, ножка толстая.

В глухом бору стоять привык

Белый гриб растёт под ёлкой

Любит прелые иголки.

Загляни под ёлку смело

Там растёт грибочек белый

Крепок, вкусен и пригож

Царь грибов собой хорош

На толстой крепкой ножке я.

Найти попробуйте меня.

ПОДБЕРЕЗОВИК — растет в основном под березой, шляпка круглая, ножка тонкая, высокая, шляпка темно-коричневого цвета.

Под берёзкой у дорожки

Кто стоит на крепкой ножке?

Он, в коричневом берете,

Самый вкусный гриб на свете.

Подберёзовик – крепыш.

Соберём его малыш.

ПОДОСИНОВИК — с красной шляпой, ножка высокая.

Под осинкой притаился,

Жёлтым листиком накрылся

Гриб на крепкой ножке серой,

В красной шляпке, загорелый.

Подосиновик-малыш.

Право, славненький, крепыш.

МУХОМОР — самый распространенный ядовитый гриб. Ножка длинная, есть белый воротничок. Шляпка красная, круглая, в белую крапинку.

Смотрит заинька в упор

Вот так чудо мухомор!

С красной шляпкой,

С белой ножкой.

У гриба красивый вид,

Только жалко-ядовит!

Слайд № 7 и 8

Воспитатель: Предлагаю вам слепить сои замечательные грибы! А какой а вас будет гриб, решайте сами!

Слайд № 9 и 10

Воспитатель: Ребята, посмотрите ещё раз на грибы. Давайте повторим, из каких частей они состоят.

Чем они похожи?

Воспитатель: Правильно ребята. Грибы различаются цветом и формой шляпки. Теперь давайте, слепим грибочки.

Воспитатель: Первым делом мы слепим ножку. Для этого нам надо скатать в столбик пластилин выбранного вами цвета, получится ножка у грибочка.

Воспитатель: Давайте сделаем перерыв и разомнём пальчики.

Пальчиковая гимнастика «Грибы»

Раз, два, три, четыре, пять! «Шагают» пальчиками по столу.

Мы идем грибы искать.

Этот пальчик в лес пошел, Загибают по одному пальчику,

Этот пальчик гриб нашел, начиная с мизинца.

Этот пальчик чистить стал,

Этот пальчик жарить стал,

Этот пальчик все съел,

Оттого и потолстел.

Воспитатель: Отдохнули? Давайте продолжим. Возьмём пластилин нужного вам цвета для шляпки. Скатать в шар и сплющить его между ладонями – получится шляпка для гриба. Теперь соединяем ножку с шляпкой, сглаживаем их между собой. Вот ребята, получились у нас грибы. Давайте выставим их на нашу полянку.

Ответы детей.

Дети идут в хороводе.

Скачут в присядке, изображая белочек.

Скачут стоя.

Идут, изображая медведя.


Ответы детей.

Ответы детей.

Движения детей.

  1. Этап занятия.

Заключительный. Рефлексия. 5 минут

Цель этапа: подведение итогов занятия, построив траекторию дальнейшей работы по освоению новой темы для каждого воспитанника.

Цель этапа:

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

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

Анализ занятия:

– Что нового вы сегодня узнали?

– Что вам больше всего понравилось?

– Какие названия грибов вы запомнили?

Все сегодня молодцы. Наше занятие закончилось, но вас ждёт сюрприз –

Осень решила вам подарить вот такие цветные карандаши, чтоб вы смогли нарисовать её портрет!

На этом наше занятие подошло к концу. Спасибо, можете быть свободны.

Ответы детей.

Список литературы

  1. Примерная общеобразовательная программа «От рождения до школы» авторы Н. Е.Веракса, Т. С. Комарова, М.А. Васильева. Комплексные занятия. Старшая группа.

  2. Л.И. Пензулаева. «Планы и конспекты занятий. Оздоровительная гимнастика для детей 3-7 лет».

  3. Л.И. Пензулаева. «Физическая культура в детском саду» Старшая группа.

  4. Комплексно-тематическое планирование по программе «От рождения до школы» под ред. Н.Е. Вераксы. Подготовительная группа.

5. Комплексное планирование. Старшая группа. (под ред. М.А. Васильевой).

6. Н.С. Голицына Перспективное планирование в детском саду. Старшая группа. Реализация ФГТ ДОУ (2 части).

7. http://www.maam.ru – международный образовательный портал

8. http://dovosp.ru/ – журнал «Дошкольное воспитание»

9. https://yandex. ruкартинки по лепке грибов старшем дошкольном возрасте, картинки с изображением осеннего времени года.

10. http://vospitalo4ka.ru/ – сайт «Воспиталочка»

11. http://nsportal.ru/ – социальная сеть работников образования nsportal.ru

12. http://ya-odarennost.ru/ – сайт «Одарённость.RU».

13. http://pedsovet.su/load/411 – презентации шаблоны.

14. http://ped-kopilka.ru/vospitateljam/zanjatija-s-detmi/konspekt-zanjatija-v-podgotovitelnoi-grupe-dou-po-teme-bogatyri-zemli-ruskoi.html – учебно – методидический кабинет.

Конспект паспорта проекта НОД “Моя Родина

Паспорт проекта

«Моя Родина – Россия»

Воспитатель 1 категории:

Гафурова Е.А.

Актуальность:

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

Цель:

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

Задачи:

  • Расширение представления детей о национальных праздниках.

  • Воспитание любви и уважения к русским национальным героям.

  • Развитие умений детей в продуктивной деятельности.

Участники проекта: Воспитатель, дети, родители.

Вид проекта: Комплексный, творческий.

Срок реализации проекта: 1 неделя (краткосрочный)

Подготовка к внедрению проекта:

  1. Подобрать методическую, художественную, детскую литературу; иллюстративные материалы; дидактические игры; изображение символики России.

  2. Оформить уголок для родителей о проведении проекта: «Моя Родина – Россия»

  3. Составить перспективный план мероприятий.

Создание условий для самостоятельной деятельности: военная атрибутика, подборка открыток.

Продукт проекта: Выставка рисунков по теме, создание копилки познавательной информации.

Межпредметные связи

Образовательные области

Вид

деятельности

Содержание

деятельности

Коммуникация

Познавательная

Беседа с детьми об истории праздника: «День народного единства».

Свободное общение: «Кто такие Минин и Пожарский?»

«Что означает – народное единство?»

Познание

Познавательная

Рассказ воспитателя: «Начало смутного времени», «Народное единство», «памятник Минину и Пожарскому».

Рассматривание фото, иллюстраций.

Конструирование: «Старинная крепость», «Кремль».

Художественная литература

Читательская

Писатели и поэты о празднике.

Чтение стихов, пословиц, слушание музыки.

Социализация

Познавательная

Посещение воинской части, смотр боевой техники.

Художественное творчество

Творческая

Аппликация «Флаг России».

Безопасность

Познавательная

Безопасность нашей страны, государства:

– беседа, рассказ;

– рассматривание фото, иллюстраций.

Музыка

Музыкальная

Слушание:

Струве «Моя Россия»,

«Торжественный марш»,

«Гимн России».

Физическая культура

Активная физическая деятельность

«Сильные, смелые, ловкие» – утренняя гимнастика, физкультурный досуг (занятие)

Этапы работы над проектом

Этапы

Самостоятельная деятельность детей

Совместная деятельность детей и взрослых

Формулирование проблемы

Скоро праздник – День народного единства

Подготовительный

Беседа с детьми о празднике

Экскурсии в в/ч.

Практическая деятельность

Аппликация «Флаг России». Рисование рисунков по теме

Составление рассказа на тему: «Россия – Великая страна».

Презентация

Выставка детских работ

Стендовая информация «О подвигах наших предков».

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

Конспект НОД «Путешествие на планету Роботов».

Конспект НОД «Путешествие на планету Роботов»

Цель: конструирование роботов из геометрического конструктора.

Задачи:

Обучающие:

обучать детей моделировать и конструировать из строительного материала и деталей конструкторов;

– формировать навыки работы с геометрическим конструктором;

– научить детей строить роботов;

– закрепить знания о геометрических объемных фигурах;

– закрепить название деталей строительного материала;

Воспитывающие:

– воспитание бережного отношения к окружающему миру;

– прививать навыки аккуратности и самостоятельности;

Развивающие:

– развивать мелкую моторику пальцев рук;

– развивать пространственное представление;

– развивать внимание, воображение, сообразительность;

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

 

Ход НОД.

 

Воспитатель: – Здравствуйте, ребята! В далёкой – далёкой Галактике существует очень интересная планета…. Сегодня я предлагаю отправится в космическое путешествие на эту планету, планету «Роботов».

–   Прошу всех подойти ко мне и получить свой мульти-билет- паспорт.

Дети подходят получают свои билеты. (Приложение 1).

Я напоминаю правила поведения во время полета. Занять свои места…….

 (Дети занимают свои места за столами).

 

Воспитатель: Мы рады вас приветствовать на нашем космическом корабле. Желаем вам приятного полета. Пристегните свои ремни, ведем обратный отсчет  10…..0 пуск.

Логопедическое упражнение «Полет» пропевание гласных с нарастанием силы голоса, чем громче голос, тем выше поднимаем руки.

Воспитатель: Мы прибыли на планету «Роботы» Отстегните свои ремни, паспорт положите на стол и выходите на планету. (подходят к выставке робототехники)

Воспитатель:  Мы рады вас приветствовать на планете «Роботов».  Ребята, как вы думаете кто, живет на этой планете? (Демонстрация и рассматривание выставки: автотрек, собака – робот, робот на пульте управления и т.п.).

(Дети говорят свои предположения).

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

Воспитатель: Каких роботов вы знаете?

Дети: Роботы, которые помогают по хозяйству: готовят, убираются: робот – пылесос; спасают людей в чрезвычайных ситуациях

Воспитатель: Для чего нужны роботы? Зачем человек их изобретает?

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

– А у нас на планете встречаются роботы, какие они?  Ответы детей

– А они едят? (Нет, они работают от батареек)     Ответы детей

Воспитатель: Правильно ребята, молодцы!

Существует несколько разновидностей роботов и для каждого из них имеется своё определение. (Показ разновидностей роботов, техники и пр.)

Промышленные роботы: машины, которые создают различную продукцию

Бытовые роботы: автоматические пылесосы

Боевые роботы: заменяют человека в военных целях

Игрушки- роботы

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

Ребята, а как называются люди (специалисты), создающие роботов? (инженер-робототехник)

 Воспитатель: Молодцы ребята! Давайте мы поиграем в роботов.

Дети повторяют движения и речь капитана четко проговаривая слова по слогам:

Робот железный по планете шагает-

Робот железный все видит все знает-

Робот не ест, не спит и не пьет-

И дольше людей на планете живет.

Воспитатель: Давайте сделаем так, чтобы на планете было больше жителей-роботов! Для этого каждый из вас превратится в робототехника, и изобретет своего робота! Можно изобрести летающую тарелку, ракету……..(детям можно предложить схемы, по которым будут строить роботов, так же дети могут проявить фантазию и изготовить самостоятельно)

Конструирование роботов из

большого конструктора

среднего и мелкого конструктора

конструктора «весёлая стройка»

конструктора «Лего»                                        (Приложения 2-8)

Воспитатель: Вот какие замечательные роботы у нас получились! Мы увеличили население планеты РОБОТОВ! МОЛОДЦЫ!

Приложение 1.   Билеты.

 

Приложение 2.

 

 

 

 

Приложение 3

 

 

 

Приложение 4.

 

 

 

 

 

Приложение 5.

 

Приложение 6.

 

Приложение 7.

 

Приложение 8.

Фото из архива группы.

 

 

 

Конспект НОД в подготовительной группе. В Царстве цветов

Вашему вниманию конспект второго занятия по лекарственным растениям для подготовительной группы.

Цель занятия по растениям – закрепить знания, полученные на первом занятии; научить узнавать и различать некоторые лекарственные растения.

Задачи : фиксировать знания о растениях с детьми, об их полезных свойствах.

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

Развивать активность и выдержку у детей.

Научить давать описание растению и опознавать его по описанию.

Воспитывать уважение к природе, уметь слушать других детей и дополнять их ответы.

Словарная работа : отвар, настой, лекарственные растения.

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

Ход занятия :

Воспитатель входит в группу с детьми. На доске уже закреплены картинки иллюстрирующие лекарственные растения. На столах разложены гербарии с лекарственными растениями.

Воспитатель: Посмотрите, ребята как красиво у нас. Как много на подоконниках комнатных растений. От этого уютно! А скажите где произрастают растения и где мы все их можем увидеть?

Дети: В парке, на огороде, в лесу и на лугу.

Воспитатель: Давайте дети мы представим что мы пришли на луг и сели полукругом.

Дети садятся полукругом на стульчики.

На лугу мы увидим Ромашку, Клевер, Лютик едкий, Гвоздику, Колокольчик, Смолку, Хвощ, Васильки, Подорожник, Вьюнки.

Воспитатель: А скажите дети, что это за растения? Как их все можно назвать иначе?

Дети: травы и цветы луговые.

Воспитатель: А какими качествами они обладают?

Дети: Лекарственными.

Воспитатель: А почему эти растения лекарственные?

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

Воспитатель: Посмотрите, как называется это растение? (показывает подорожник)

Дети: Это подорожник.

Воспитатель: А почему подорожник имеет такое называется?

Дети: потому что он произрастает вдоль дорог.

Воспитатель: Рассмотрите и пишите подорожник.

Дети: Листья с прочными прожилками, упругие, прижаты к земле. Корни – это густой пучок. Стебель упругий.

Воспитатель: Ребята, а как растение расселяется по земле?

Дети: Семена подорожника приклеиваются к ногам проходящих на время, а потом отпадают и так перебираются в новое место.

Воспитатель: А как с его помощью лечат?

Дети: Нужно сорвать лист с растения, немного помять чтобы выступил сок и приложить к ране.

Воспитатель: Дети, угадайте о каком растении речь в загадке? Вот она:

В беленьких платьицах,

желтые глазки…

вы назовете их без подсказки.

Дети: это ромашки.

Воспитатель: Одна из известных и распространенных – это аптечная ромашка.

А в чем полезные свойства ромашки?

Дети: Отваром из ромашки при ангине полощут горло.

Воспитатель: А еще ее используют в косметологии и кулинарии. Делают краски, крема и пасты.

А вот еще загадка о лекарственном растении.

Русская-красавица

Всем-нам-очень-нравится.

Бела-она,-стройна

Одежда-зелена.

Что это за такая красавица-то?

Дети: это береза.

Воспитатель: А как березу называют еще и почему?

Дети: Плакучая береза, так как ее веточки смотрят вниз.

Воспитатель: А какая у листьев березы форма?

Дети: Как сердце, сердцевидная форма.

Воспитатель: Медицина предлагает использовать против чесотки и для заживления ран березовый деготь. Из березы так же делают активированный уголь. Его используют при болях желудка и отравлении.

Теперь послушаем следующую загадку.

Воспитатель: О каком растении речь? Этот кустарник родственник садовой розы.

Дети: это шиповник.

Воспитатель: А почему Шиповник так называется?

Дети: так как на его ветвях есть шипы.

Воспитатель: хорошо. У шиповника не только цветы красивые, но и ягоды. Они буровато – красноватого или оранжевого цвета.

А за что люди ценят Шиповник?

Дети: В его ягодах содержится много витамина «Ц». Из плодов готовят отвар, который пьют для укрепления сил организма. Маслом шиповника мажут раны при ожогах. Настоем лепестков шиповника смазывают кожу лица для освежения.

Воспитатель: Хорошо, ребята, а что у нас в группе за цветок с приятным запахом?

Дети: это комнатная мята.

Воспитатель: Мята – полезное растение. А кто из вас знает его свойства?

Дети: отвар его листочков от простуды поможет. Чай из листочков успокаивает. Мяту для освежения дыхания добавляют в пасту для чистки зубов.

Воспитатель: предложу вам определить растение по запаху. Отдаю несколько мешочков.

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

Воспитатель: Ребята, давайте отгадайте несколько загадок о растениях.

Солнышком-лучистым
В-травке-золотистой
Белым-облаком-по-полю-разлетится
(одуванчик)

В-красном-платьице-рябина
Вышла-с-осенью-проститься
Осень-проводила
Платье-снять-забыла.
(рябина, Калина)

Не-огонь,-а-жжется?
(крапива)

Воспитатель: А сейчас «Соберите пазлы с растениями».

Дети собирают картинки у двух столов на скорость.

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

Воспитатель: Пока мы говорили о растениях, у нас заварился чай. Давайте попробуем его и определим какие растения использованы при заваривании.

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

Конспект занятия в детском саду: В мире комнатных растений для детей 5-7 лет.


Автор : Нерсесян Наира Игоревна, воспитатель МБДОУ “Детский сад общеразвивающего вида № 144”, г. Воронеж
Назначение : Воспитатели ДОО, учителя начальных классов, любознательные родители. Конспект подходит для занятия с детьми 5-7 лет.
Цель : Называть растения и основные его части. Правильно ухаживать за растениями.
Задачи -Расширять знания о комнатных растениях.
-Дать представление о размножении комнатных растений.
-Развивать навыки исследовательской деятельности детей 5-7 лет в ходе совместной деятельности.
-Воспитывать бережное отношение к природе.
-Развивать любознательность, трудолюбие.
-Научить изображать комнатные растения.
-Совершенствовать навыки по уходу за растениями.
-Ознакомить с несколькими видами комнатных растений.
-Расширять знания воспитанников по экологической культуре.
Предварительная работа Создание предметной среды, направленной на развитие интереса детей к растениям, наличие демонстрационного материала: картинки и плакаты из серии >. Видеоматериал – для показа на экране.

Ход занятия

Воспитатель Отгадайте загадки:> (Растение).
Очищают воздух,
Создают уют,
На окнах зеленеют,
Круглый год цветут.(Комнатные растения)
О чем сегодня будем говорить? (О комнатных растениях).
Накрыт бокал с водицей,
Ежовой рукавицей. (Кактус)


В кадке вырос куст,
И широк,и густ:
Лист как кожаный,
Плотно сложенный,
Ствол бузиновый,
Как резиновый. (Фикус)


Лист с горбочком, желобочком,
Шипы имеет,а ранить не умеет,

Зато лечит нас в любой час. (Алое)


На окне стоит горшок,
В нём чудеснейший цветок,
Фиолетовый, изящный,
Ароматом манящий! (Фиалка)


Воспитатель Какие еще комнатные растения,кроме вышеперечисленных вы знаете? (Каланхоэ, кала, папоротник). Покажите картинку?


Воспитатель Действительно, эти растения выращивают только в помещениях, потому что родина большинства из них- жаркие страны, где круглый год лето.Человек создает и зимой примерно такие же условия, как и летом. Но почему?
Дети Создаются все условия, чтобы растения не погибли, зимой не замерзли.
Воспитатель Вспомните, что необходимо для растений?
Дети Растениям необходима почва, свет, тепло, воздух, вода.
Воспитатель Помощников растений пять, как пять пальцев на руке. Растениям нужна почва?
(Да,они растут в горшках с землей).
Почему комнатные растения ставят на подоконник? (Для роста им нужен свет).
Почему комнатные растения осенью и зимой не выносят на улицу? (Им нужно тепло).
Какое еще условие необходимо растениям, чтобы они хорошо росли? (Растениям нужен воздух, чтобы они дышали).
Что надо делать, чтобы им стало легче дышать? (Чтобы воздух попадал к корням растения, нужно рыхлить землю, надо протирать с них пыль).
Пятое условие для роста растений какое?(Необходима вода – их надо регулярно поливать).
Посмотрим как растет цветок.

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


Комнатных растений очень много, познакомимся еще с несколькими из них.
Вверх по стенке крутой,
По бетонке литой,
Многоножка ползет,
С собой листья везет. (Плющ)


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


Физкультминутка
Во дворе растёт подсолнух.
Во дворе растёт подсолнух,
Утром тянется он к солнцу. (Дети встают на одну ногу и тянут руки вверх.)
Рядом с ним второй, похожий,
К солнцу тянется он тоже. (Дети встают на другую ногу и снова тянут руки вверх.)
Вертим ручками по кругу.
Не задень случайно друга!
Несколько кругов вперёд,
А потом наоборот. (Вращение прямых рук вперёд и назад.)
Отдохнули мы чудесно,
И пора нам сесть на место. (Дети садятся.)

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


Для закрепления правильного ухода за растениями смотрят видеоматериал, воспитатель комментирует

Воспитатель Рассмотрите все картинки и нарисуйте ваше комнатное растение.


Воспитатель Из всех рисунков выберите наиболее выразительные и самые аккуратные.

вера щукина
Конспект занятия по окружающему миру на тему «Комнатные растения» в подготовительной группе

Конспект занятия по окружающему миру на тему «Комнатные растения » в подготовительной группе

Цели :

Формировать у детей элементарных представлений о комнатных растениях ;

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

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

Совершенствовать навыки ухода за растениями .

Дать представление о размножении комнатных растений

Воспитатель : Ребята, отгадайте загадки :

Зелёный, в колючках,

Похож на ежа,

А цветки атласные

Белые, жёлтые, красные. (Кактус)

Нет в мире ничего нежней и краше,

Чем этот сверток алых лепестков,

Раскрывшийся благоуханной чашей…”

Назовите этот цветок – царицу всех цветов (Роза)

Я тоже в комнате расту ,

И пусть я без цветов-

Тебе я ранки залечу

Без всяких докторов. (Алоэ) .

Меня по кличке все зовут,

А имени не знают.

Но будет сухо или дождь-

Я тут же сообщаю. (Бальзамин)

Был тугим он кулачком,

А разжался – стал цветком. (Бутон)

В сумраке да в сырости

Рада травка вырасти

Перистым кустом,

С пальмовым листом. (Папоротник)

Дышит, растет , а ходить не может (Растение )

Воспитатель : Мы сегодня поговорим о комнатных растениях . А почему их называют комнатные растения , комнатные цветы .

(ответы детей)

Воспитатель : Правильно, ребята. Комнатное садоводство – выращивание растений в жилых или общественных помещениях. Растения , которые способны успешно выживать и развиваться в условиях таких помещений, называются комнатными растениями . Комнатное садоводство особенно распространено в странах с продолжительной суровой зимой.

Ребята, какие комнатные растения вы знаете ? (Фиалку, плющ, хлорофитум и др.)

Скажите, что нужно для роста растения ? (ответы детей)

Сажаем в горшки (нужна почва)

Ставим на подоконник (нужен солнечный свет)

Поливаем (нужна вода для роста)

Рыхлим (нужен воздух для корней)

Все комнатные цветы можно поделить на несколько видов :

Декоративно-цветущие

Декоративно-лиственные

Плодовые

Декоративно-цветущие комнатные растения

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

Декоративно-лиственные комнатные растения

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

Плодовые комнатные растения

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

Воспитатель : а теперь посмотрим, как называются основные части растения (корень, стебель, лист, цветок, плод с семенами) .

Физкультминутка. Бабочка

Спал цветок и вдруг проснулся, (Туловище вправо, влево. )

Больше спать не захотел, (Туловище вперед, назад.)

Шевельнулся, потянулся, (Руки вверх, потянуться.)

Взвился вверх и полетел. (Руки вверх, вправо, влево.)

Солнце утром лишь проснется,

Бабочка кружит и вьется. (Покружиться .)

Воспитатель : А теперь, ребята, давайте поиграем. Давайте разделимся на две команды. Перед вами картинки цветов, но они разрезанные. Чья команда первая сложит изображение и скажет название, тот и выиграл в соревновании. Молодцы.

А сейчас мы тоже поухаживаем за нашими цветочками в группе .

Публикации по теме:

Задачи: -продолжать формировать у детей интерес к растительному миру; -закреплять знания названий комнатных растений; -уточнять представления.

Конспект занятия по окружающему миру в подготовительной группе «Зимующие птицы» Конспект занятия по ознакомлению с окружающим на тему: «Зимующие птицы». Программное содержание: – закрепить и уточнить представления.

Конспект занятия по окружающему миру в подготовительной группе «Ознакомление детей с животным миром родного края». Цель: 1. Познакомить детей с животным миром родного края. 2. Развивать связную речь, побуждая детей отвечать на вопросы полными предложениями.

Конспект занятия по окружающему миру в старшей группе «Комнатные растения» Ознакомление с окружающим миром

Конспект непосредственно образовательной деятельности для детей подготовительной к школе группы на тему “Рассматривание комнатных растений”

Земелькина Надежда Николаевна, воспитатель МБ ДОУ “Детский сад №203”, г. Новокузнецк.
Описание работы: предлагаю конспект НОД по экологическому воспитанию для детей подготовительной к школе группы (6-7 лет) на тему “Рассматривание комнатных растений”. Данная работа будет полезна воспитателям дошкольных учреждений, работающих на старших и подготовительных к школе группах детского сада. Материал поможет воспитателям уточнить знания детей об известных комнатных растениях и способах ухода за ними. Поможет познакомить детей с новым цветком – колеусом.

Цель: уточнить знания об известных детям комнатных растениях и способах ухода за ними.
Задачи
Образовательные: учить устанавливать зависимость ухода от дифференцированных потребностей растений, внешнего строения; познакомить с новым комнатным растением колеус, и способом ухода за ним.
Развивающие: развивать умение описывать растения, выделяя характерные особенности.
Воспитательные: воспитывать осознанное отношение к уходу за растениями.
Демонстрационный материал: 7 – 8 видов знакомых детям комнатных растений, предметы ухода за комнатными растениями, указка, магнитофон, аудиозапись П.И. Чайковского «Времена года», фотографии с изображением комнатных растений.
Методические приёмы: слушание аудиозаписи, загадывание загадок, рассматривание растений, продуктивная деятельность детей, дидактическая игра, художественное слово, показ, повторение, подведение итогов.

Дети, нас всюду окружает природа. Мы любуемся белоствольными берёзками, стройными рябинками, яркими цветами. Красоту и богатство природы описывают в своих стихах поэты.
(ребёнок читает стихотворение С. Есенина «Берёза»)
Своё чувство средствами музыки выражают композиторы. Предлагаю вам послушать фрагмент из музыкального цикла «Времена года» П.И. Чайковского.
Природа всегда рядом с человеком. В нашей групповой комнате много растений, за которыми мы ухаживаем.
Давай пройдемся медленно по кругу
И «здравствуй» скажем, каждому цветку.
Я должен над цветами наклониться
Не для того, чтоб рвать или срезать,
А чтоб увидеть добрые их лица
И доброе лицо им показать.
Чтобы любить природу нужно много знать о ней. Сегодня мы поговорим о комнатных растениях. У меня на столе стоят разные растения, которые вы хорошо знаете. Покажите и назовите их.
Отгадайте загадки про комнатные растения:
Большие и мохнатые
Чуть-чуть розоватые
Спустили стебли низко
И смотрят на ребят.
Листочки здесь широкие,
Зелёные и тёмные,
Как будто бы мрачного
Омута глядят.
Что это за растение,
Кто скажет из ребят? (бегония)
***
Листьев нет – одни иголки,
Стебель тонкий и прямой.
Угадайте, кто такой? (аспарагус)
***
Из листка на удивленье
Можно вырастить растение.
Я сорву цветок, не жалко,
Будет новая…. (фиалка).
***

Ваньки мокрого цветки.
Так назвал его народ –
Много он водички пьёт.
А как правильно назвать,
Постарайся сам назвать! (Бальзамин)
***
Вверх по стенке крутой,
По бетонке литой
Многоножка ползет,
С собой листья везет. (Плющ)
***
– Что за хвост пошёл в рост:
Не в пруду, не в речке –
На окне, у печки. (Сансевьера /щучий хвост)
***
Хотели детишки от мамы удрать,
Но мама сумела их всех удержать.
Вот так и висят те пучки – малолетки.
На нитях – зелёные растения-детки. (Хлорофитум)
***
– Какие части растений вы знаете? (предлагаю показать)
– У всех ли растений есть стебли?
– У каких растений их нет?
– У разных растений стебли разные: есть прямые, вьющиеся, свисающие. Покажите стебли и назовите их особенности.
– Одинаковы ли листья у растений по цвету, форме, величине? (предлагаю показать и рассказать о листьях)
– А у всех ли растений есть листья? Например, у кактуса и аспарагуса листьев нет, а вместо них маленькие иголочки.
– Чтобы растения хорошо росли и цвели за ними нужно ухаживать. Расскажите, как ухаживать за растениями? (Предлагаю 1-2 детям правильно показать, как нужно поливать)
– Всем ли растениям нужно одинаковое количество влаги? Некоторые растения зимой отдыхают и их нужно поливать редко. Например, амариллис.
– А какие растения любят влагу? (бегония, традесканция)
– Для чего нужно рыхлить землю в горшочках? Правильно:
рыхление почвы проводят во влажном состоянии, при рыхлении сухой почвы можно повредить корни.
рыхлая почва способствует лучшему обеспечению растения водой (лучше впитывается вода)
рыхлая почва дольше удерживает влагу, чем уплотненная (предлагаю показать, как правильно рыхлить)
Недаром рыхление называют сухим поливом.
– Для чего нужно убирать с листьев пыль? Какие способы уборки пыли вы знаете? (протирать влажной губкой или тряпочкой, опрыскивать, стряхивать пыль сухой или влажной кисточкой)
(Предлагаю показать растения и объяснить, почему применяется тот или иной способ ухода. Вызываю несколько детей показать способы очищения листьев от пыли)
– Ребята, сегодня мы познакомимся с новым растением. Оно называется колеус, народное название – «крапивка». Само оно родом из жаркой Африки и тропических лесов Азии. (предлагаю отметить, чем оно отличается от других растений, предлагаю описать).
Давайте подумаем, как правильно ухаживать за колеусом. (вызываю нескольких детей показать, как правильно это делать)
Послушайте стихотворение про колеус:
Если я цвету –
Значит я умру,
Чаще нужно поливать
И, конечно, удобрять.
Чем больше света и тепла,
Тем краснее я, друзья.
А если света не хватает,
Зеленеть я начинаю.

А теперь, давайте поиграем в игру «Найди такой же».

Дидактическая игра «Найди такой же»
Дидактическая задача. Найти предметы по сходству.
Игровые действия. Поиск похожего предмета.
Правило. Показывать узнанное растение можно только по сигналу воспитателя, выслушав его описание.
Оборудование. Одинаковые растения, расставленные на двух столах или фотографии с изображением растений.
Ход игры. Воспитатель показывает какое-нибудь растение на одном из столов (фото), описывает его характерные особенности, а затем предлагает ребенку найти такое же растение в группе.
Итог НОД проводиться с помощью детей.

Программные задачи:

Уточнить и расширить представления о лекарственных растениях и их целебных свойствах;

Закрепить понятие о взаимосвязи растительного мира и человека;

Формировать умение ухаживать за растениями;

Воспитывать заботливое и бережное отношение ко всему живому.

Демонстрационный материал:

Гербарий, засушенные цветы липы, мёд, фотографии лекарственных растений.

Ход занятия.

1.Вводная часть.

Посмотрите внимательно, дети, что у меня в руках?

Растения.

Правильно. Сегодня мы поговорим о растениях. Давайте вспомним, что мы относим к растениям?

Деревья, цветы и кустарники.

Людям нужны растения?

Для чего?

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

2.Основная часть.

Природа предоставляет человеку огромное разнообразие даров- лекарства от всех болезней. Их надо только знать и уметь ими пользоваться. Многие люди сами занимаются сбором трав на лугу, в лесу, в поле. Может и ваши родители или бабушки тоже собирали лекарственные травы. Знания о лекарственных травах пригодятся каждому человеку. Прежде чем идти их собирать, необходимо всё о них знать.

— Сегодня мы познакомимся с некоторыми лекарственными растениями. — -Может мне кто назовёт уже знакомое лекарственное растение.

Давайте поиграем в игру «Отгадай загадку».

Я буду загадывать загадки, а вы глазами на стенде найдите отгадку. Кто найдёт поднимет руку.

Стоят в поле сестрички,

Жёлтый глазок

белые реснички (ромашка).

Кто нашёл это растение?

Это цветок ромашка, его белые лепестки обвивают ярко-жёлтый глазок.

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

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

Как ромашка ты мила!

Твоя кофточка бела

Воротник золотой

На нас смотрит с добротой!

Послушайте следующую загадку.

Я знаменита не цветами,

А необычными листами:

То твердыми, холодными,

То мягкими и теплыми.(мать- и- мачеха)

Кто нашёл эту картинку?

Это растение называется Мать и мачеха. А вы знаете почему оно так называется? У него с одной стороны листочек тёплый- мать, а с другой холодый-мачеха. Ещё лежит на земле снег, а цветы мать-и-мачехи покрывают проталинки. С конца марта до мая улыбаются они солнышку. Прячась лишь вечером или в пасмурный день. Также это растение дружит с насекомыми и очень полезно для людей. Полезно пить чай — для очищения лёгких. Если положить лист тёплой стороной на ранку, то она вытягивает из неё боль, красноту. Вот такое полезное это растение.

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

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

и рассказывать полезные свойства.

1- одуванчик- используется для восстановления аппетита;

2-крапива- останавливает кровотечение;

3- ромашка – успокаивает сердце и душу;

4 – подорожник – листик используется для заживления ран;

5 – липа – липовый чай пьют при простуде;

6 – календула – свежий сок применяют для ушибов и ожогов;

7 – черёмуха – отвар черёмухи пьют при расстройстве желудка;

8 – рябина – хорошо используется в косметике;

9 – шиповник – вкусный чай, маслом шиповника лечат ожоги;

10 – мать -и- мачеха – полезно пить чай для очищения лёгких.

Молодцы, дети, мы вспомнили свойства знакомых нам лекарственных растений и закрепили новые знания.

А кто мне скажет на территории нашего детского сада деревья с лекарственными растениями? (Липа).

Правильно это липа – стройное, высокое дерево с густой пышной кроной. Зацветает липа в середине лета, в июле.

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

3. Заключительная часть.

Вот сколько много интересного мы сегодня узнали. У меня для вас есть сюрприз. Сегодня мы тоже о себе позаботимся. Мы будем пить липовый чай.

Детский сад №29 г.Челябинск

 

                
 

 


 

  

Официальный сайт

Муниципального бюджетного дошкольного образовательного учреждения

“Детский сад №29 г. Челябинска”

 

     ПРОФИЛАКТИЧЕСКИЕ МЕРОПРИЯТИЯ 

 

     Здравствуйте, уважаемые посетители нашего сайта!      Мы рады приветствовать Вас на виртуальном пространстве

             Детского сада №29 .
Будем знакомы!
Наш  детский сад  открыл свои двери для дошколят в 1969 году. С 2003 года приоритетными направлениями деятельности нашего детского сада является сохранение и укрепления физического здоровья дошкольников и коррекция опорно-двигательного аппарата. В конце 2015 года путем реорганизации (Распоряжения Администрации города Челябинска от 25.09.2015г. №10245-к) наш детский сад объединился с детским садом №154.  В настоящее время МБДОУ №29 имеет два здания, которые расположились по улице Василевского, 72 и Грозненская, 56. 
На данным момент в нашем детском саду функционируют группы компенсирующей направленности для детей с нарушением опорно-двигательного аппарата (ул.Василевского, 72) и группы компенсирующей направленности для детей с задержкой психического развития и группа для детей с нарушением интеллекта ( ул. Грозненская, 56), а так же общеобразовательные группы.
Согревать и создавать хорошее настроение нашим мальчишкам и девчонкам, помочь им вырасти здоровыми, умными и добрыми – наша главная задача.  
Конечно же, мы считаем свой детский сад самым лучшим и необыкновенным, а наших педагогов и воспитанников – самыми талантливыми. А уж рассказывать об этом можем до бесконечности! Но, как говорится, лучше один раз увидеть, чем сто раз услышать. Надеемся, что на страницах этого сайта вы сможете составить собственное представление о том, как живет и работает коллектив нашего детского сада.
Детский сад на Грозненской,56                                               Детский сад на Василевского, 72
           
 

УЧРЕДИТЕЛЬ: Комитет по делам образования города Челябинска

Юридический адрес: 454080, г. Челябинск, ул. Володарского, 14

Телефон: (351) 266-54-40

E-mail: [email protected]

 ОФИЦИАЛЬНО
                 

Горячая линия «Экстремизму – НЕТ!»

 

 

Конспект НОД “Птица-синица” для детей 4-5 лет.

– Конспекты, сценарии, рекомендации – – Методическая копилка

 

Конспект НОД «Птица-синица» для детей 4-5 лет.

Цель: уточнение и расширение  представления детей о синице, её внешнем виде, питании, особенностях жизни в зимних условиях.

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

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

Предварительная работа: наблюдения за птицами на прогулке, рассматривание иллюстраций птиц.

Ход:

1. Организационный момент

(Изображения синицы)

С жёлтой грудкою  летит

Что это за птица?

Как наряден ее вид!

Звать ее – синица!

 

Летом мошек ест она, 

А в морозец зерна

По характеру шустра,

Быстра и проворна.

 

2. Беседа по теме

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

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

Синица, как правило, оседлая птица. Что это значит?…Значит, что она живёт на одном месте. Не улетает далеко. В отличие от кочующих птиц.

Синица  подвижная, вертлявая птица. Размером примерно с воробья, имеет достаточно длинный хвост. 

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

4. Беседа по теме

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

(Звучит аудиозапись с пением синицы) MP3

 

Ребята, а вы знаете, чем питаются синицы? 

Летом они едят мелких насекомых, жуков и  тем самым  , приносит несомненную пользу природе Уничтожая большое количество вредителей леса. Осенью синицы питаются  семенами, ягодами и плодами. А зимой совсем мало остается пищи для синиц. Поэтому они из лесов прилетают поближе к людям в поисках корма. Как вы думаете, чем мы можем помочь птицам? … А чем можно подкармливать синиц? … Семечками, пшеном. А еще синички любят клевать кусочки мяса и сала…

 5. Физминутка

Песня про синичек (Наталья Ключкина)

В небесах такая синь, синь, синь –

Насмотреться невозможно.

За окном синички тинь-тинь-тинь.

Не спугни их, осторожно.

А когда наступят хо-ло-да,

И закружат злые вьюги,

Покорми синичек. Мы всег-да

Позаботимся о друге.

Ты насыпь в кормушку се-ме-на

И повесь кусочек сала,

Чтоб зимой синичка ни од-на

В стужу бы не голодала.

Снова будет в небе синь, синь, синь,

Снег искрится так красиво.

За окном синички тинь-тинь-тинь

Говорят тебе “спасибо”.

 

6. Повторение изученного материала

Молодцы! Садитесь. А теперь скажите мне еще раз как называется птичка? Где живет? Почему, когда становится холодно, они прилетают ближе к людям?…Чем их нужно подкармливать?…

 

7. Раскрашивание с целью закрепления материала

  А теперь посмотрите что у меня есть. Кто это? Давайте их раскрасим. Карандаши какого цвета нам понадобятся, чтобы раскрасить синичек?  Желтый, синий, черный. Приступайте

 Раскрашивание под  музыку (Моцарт в аранжировке для детей)

Слышу я: звенит синица 

Средь желтеющих ветвей; 

Здравствуй, маленькая птица, 

Вестница осенних дней! (тургенев)

8. Итог занятия, оценка деятельности детей.

 

    

 

 

 

паспорт – нпм

Passport — это экспресс-совместимая аутентификация промежуточное ПО для Node. js.

Единственной целью

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


Sponsors

LoginRadius создан для того, чтобы сообщество разработчиков интегрировало надежную аутентификацию и единый вход всего в несколько строк кода.
БЕСПЛАТНАЯ регистрация


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


Статус:

Установить

  $ паспорт установки npm
  

Использование

Стратегии

Passport использует концепцию стратегий для аутентификации запросов. Стратегии может варьироваться от проверки учетных данных имени пользователя и пароля, делегированных аутентификация с использованием OAuth (например, через Facebook или Twitter) или федеративной аутентификации с использованием OpenID.

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

 паспорт.использовать(новый LocalStrategy(
  функция (имя пользователя, пароль, готово) {
    User.findOne({имя пользователя: имя пользователя}, функция (ошибка, пользователь) {
      если (ошибка) { вернуть сделано (ошибка); }
      if (!user) { return done(null, false); }
      если (!пользователь.verifyPassword (пароль)) { return done (null, false); }
      вернуть готово (ноль, пользователь);
    });
  }
)); 

Существует более 480 стратегий. Найдите нужные на сайте:passportjs.org

.
Сессии

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

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

 паспорт.serializeUser (функция (пользователь, выполнено) {
  сделано (ноль, user.id);
});

паспорт.deserializeUser (функция (идентификатор, сделано) {
  User.findById (идентификатор, функция (ошибка, пользователь) {
    сделано (ошибка, пользователь);
  });
}); 
Промежуточное ПО

Чтобы использовать Passport в экспресс или Приложение на основе подключения, настройте его с необходимым паспортом .initialize() промежуточное ПО. Если ваше приложение использует постоянные сеансы входа в систему (рекомендуется, но не требуется), pass.session() также необходимо использовать промежуточное ПО.

 вар приложение = экспресс();
app.use(require('serve-static')(__dirname + '/../../public'));
app.use(require('cookie-parser')());
app.use(require('body-parser').urlencoded({extended: true}));
app.use(require('express-session')({secret: 'keyboard cat', resave: true, saveUninitialized: true }));
app.use(passport.initialize());
приложение.использовать (паспорт.сессия()); 
Аутентифицировать запросы

Passport предоставляет функцию authentication() , которая используется в качестве маршрута. промежуточное ПО для аутентификации запросов.

 app.post('/логин',
  pass.authenticate('local', { failureRedirect: '/login' }),
  функция (требование, разрешение) {
    res.redirect('/');
  }); 

Стратегии

Passport имеет полный набор из более 480 стратегий аутентификации. охватывает социальные сети, корпоративную интеграцию, услуги API и многое другое.

Искать все стратегии

Поиск стратегии на сайтеpassportjs. org

В следующей таблице перечислены часто используемые стратегии:

Примеры

  • Полный рабочий пример см. в примере который использует паспорт-местный.
  • Локальная стратегия : обратитесь к следующим руководствам по настройке аутентификации пользователя с помощью LocalStrategy ( Passport-local ):
  • Социальная аутентификация : Обратитесь к следующим руководствам по настройке различных стратегий социальной аутентификации:

Связанные модули

Страница модулей на wiki перечисляет другие полезные модули которые основаны на Passport или интегрированы с ним.

Лицензия

Лицензия Массачусетского технологического института

Copyright (c) 2011-2021 Джаред Хэнсон

Node JS с упрощенной аутентификацией по паспорту | by Prashant Ram

Следующие шаги показывают основной синтаксис паспорта для интеграции «Pashport JS» в ваше приложение NodeJS Express.

Шаг 1: Импортируйте библиотеки в ваш файл

   //Импорт Express   
const express = require('express')
const app = express() //Импорт основного паспорта и экспресс-сессии library
constpassport=require('passport')
const session = require('express-session') // Импорт вторичной библиотеки "Стратегия"
const LocalStrategy = require('passport-local') .Стратегия // В этом примере мы будем использовать «локальную» стратегию

Шаг 2: Инициализация ПО промежуточного слоя

  app.use(session({ 
secret: "secret",
resave: false ,
saveUninitialized: true ,
}))

// Это базовая экспресс-инициализация сеанса ({..}). app.use(passport.initialize())
// инициализировать паспорт при каждом вызове маршрута. app.use(passport.session())
// разрешить паспорту использовать "экспресс-сессию".

Шаг 3: Используйте паспорт для определения стратегии аутентификации

  паспорт.use(new LocalStrategy (authUser))  // "authUser" — это функция, которую мы определим позже, которая будет содержать шаги для аутентификации пользователя и будет возвращать "аутентифицированного пользователя". 

Шаг 3a: Определите функцию «authUser» для получения аутентифицированных пользователей

Функция «authUser» — это функция обратного вызова, которая требуется в рамках LocalStrategy и может принимать три аргумента.
«Пользователь» и «пароль» заполняются из «req.body.username» и «req.body.password».Их можно использовать для поиска в БД, чтобы найти и аутентифицировать имя пользователя/пароль, которые были введены в форме «логин».

 authUser =  (пользователь, пароль, выполнено)  => {  //Поиск пользователя, пароль в БД для аутентификации пользователя   //Предположим, что поиск в вашей БД дал совпадение имени пользователя и пароля для "Кайл".   let authentication_user = {id: 123, name: "Kyle"} return done (null,  authentication_user ) 
}

Функция “done()” затем используется для передачи “{authenticated_user}” в функцию serializeUser( ) функция.

Обратите внимание, функция done(, ) в «authUser» передается как ,

  1. Если пользователь не найден в БД, false)    2. Если пользователь найден в БД, но пароль не совпадает, 
выполнено (null, false) 3. Если пользователь найден в БД и пароль совпадает,
выполнено ( null, {authenticated_user})

i.е.

  • , если пользователь не найден,
    выполнено ( <нет ошибки> , поэтому ноль, <нет подходящего пользователя> , поэтому false ),
  • , если пользователь найден, но пароль не совпадает,
    (
    выполнено <нет ошибки> , поэтому null , <нет подходящего пользователя> , поэтому false )
  • , если пользователь найден и пароль совпадает, мы нашли нашего аутентифицированного пользователя и сделали ( <нет ошибки> , поэтому null, <пропустить аутентифицированного пользователя в serializeUser()>)

Шаг 4: Сериализация и десериализация (аутентифицированных) пользователей

SerializedUser:

  паспорт. serializeUser  ( (  userObj  , done) => { done(null,  userObj  )}) ---------- ЧТО ДЕЛАЕТ СЕРИАЛИЗОВАТЬ ПОЛЬЗОВАТЕЛЬСКОЕ СРЕДСТВО? 1.  "express-session"  создает объект  "req.session" , когда он вызывается через  app.use(session({..}))  2.  "passport"  затем добавляет дополнительный объект " рек.сессия.  паспорт  "на настоящую "рек.сессию".3.  Все, что делает функция serializeUser(),  
получает объект "аутентифицированный пользователь" из структуры "Стратегия" и прикрепляет аутентифицированного пользователя к " req.session.passport.user.{..} "В приведенном выше случае мы получаем {id: 123, name: "Kyle"} из done() в функции authUser в структуре стратегии,
, так что это будет быть прикрепленным как
req.session.passport.user. {id: 123, name: "Kyle"}
3. Таким образом, во время "serializeUser" библиотека PassportJS добавляет аутентифицированного пользователя в конец " req.session.passport " объект.
Это то, что подразумевается под сериализацией. Это позволяет аутентифицированному пользователю быть "привязанным" к уникальному сеансу.Вот почему используется библиотека PassportJS, поскольку она абстрагируется от этого и напрямую поддерживает аутентифицированных пользователей для каждого сеанса в пределах "req.session.passport.user. {..} " ----- -----------------------

Десериализация пользователя:
Теперь в любое время, когда нам нужны данные пользователя для сеанса, мы можем просто получить объект который хранится в «req.session.passport. пользователя.{..}».

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

 pass.deserializeUser((  userObj  , done) => { done (null,  userObj  )})----------------ЧТО ЗНАЧИТ DE SERIALIZ USER?1 . Passport JS удобно заполняет значение «userObj» в deserializeUser() объектом, прикрепленным в конце  «req.session.passport.user.{..}»  2. Когда  выполнено (null, user)  вызывается в deserializeUser(), Passport JS берет этот последний объект, присоединенный к  "req.session.passport.user.{..}"  , и присоединяет его к  "req.user"  т.е. "  req.user.{..}  "В нашем случае, так как после вызова done() в " serializeUser» у нас было  req.session.passport.user.  {id: 123, name: «Kyle»}   , вызов done() в «deserializeUser» возьмет этот последний объект, который был прикреплен к  req. session.passport.user.{..}  и прикрепить к  req.user.{..}  
т.е. req.user. {id: 123, name: "Kyle"} 3. Таким образом, "req.user" будет содержать объект аутентифицированного пользователя для этого сеанса , и вы можете использовать его в любом из маршрутов в приложении Node JS.
напр.
app.get("/dashboard", (req, res) => {
res.render("dashboard.ejs", {name: req.user.name })
})

Шаг 5: Использование pass.authenticate() в качестве промежуточного программного обеспечения на вашем маршруте входа

Теперь вы можете использовать функцию паспорта.authenticate() в app.post() и указать приложение successRedirect и failureRedirect,

.post ("/login",  pass.authenticate  ('local', { 
successRedirect: "/dashboard",
failureRedirect: "/login",
}))

‘local’ означает, что мы используем ‘ локальная стратегия. Если бы вы использовали Google или Facebook для аутентификации, там было бы написано «google» или «facebook» вместо «local».

Шаг 6: Используйте функцию «req.

isAuthenticated()» для защиты зарегистрированных маршрутов

Passport JS удобно предоставляет «req. isAuthenticated()» , эта функция

  • возвращает «true» в случае, если аутентифицированный пользователь присутствует в «req.session.passport.user» или
  • возвращает «false» в случае в «req.session.passport.user» нет аутентифицированного пользователя.

Функцию «req.isAuthenticated()» можно использовать для защиты маршрутов, доступ к которым возможен только после входа пользователя, например. приборная доска.

 Создайте функцию следующим образом: 
------------checkAuthenticated = (req, res, next) => {
if ( req.isAuthenticated() ) { return next() }
рез.redirect("/login")
}------------ Теперь вы можете использовать эту функцию в качестве промежуточного программного обеспечения для защиты ваших маршрутов следующим образом, app. get("/dashboard", checkAuthenticated , ( req, res) => {
res.render("dashboard.ejs", {name: req.user.name})
})

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

 Создайте функцию следующим образом: 
-----------checkLoggedIn = (req, res, next) => {
if ( req.isAuthenticated() ) {
return res.redirect("/dashboard")
}
next()
}------------ Теперь вы можете использовать эту функцию в качестве промежуточного программного обеспечения следующим образом: .get("/login", checkLoggedIn , (req, res) => {
res.render("login.ejs")
})

Шаг 7: Используйте «req.logOut()», чтобы очистить session object

Passport JS также удобно предоставляет нам «req. logOut() », которая при вызове очищает объект «req.session. passport» и удаляет все прикрепленные параметры.

Это можно использовать для выхода из системы следующим образом:

 app.delete("/logout", (req,res) => { 
req.logOut()
res.redirect("/login")
console.log(`-------> Пользователь вышел из системы`)
})

Обратите внимание, что когда вызывается функция req.logOut() , она очищает как «req.session.passport » и «req.user», т.е.

 «req.session.passport» -------> {} 
«req.user» -------> undefined

Node.js и Express Tutorial: Аутентификация с помощью Passport

В этом руководстве вы узнаете, как защитить веб-приложение Node.js , созданное с помощью платформы Express . Вы будете использовать Passport.js с Auth0 для управления аутентификацией пользователей и защиты маршрутов клиента, использующего API. Клиент визуализируется на стороне сервера с использованием шаблонов Pug , оформленных с помощью CSS .

Ищите эмодзи 🛠️️, если хотите просмотреть содержимое, сосредоточившись на этапах сборки.

Вы начинаете с этой главы?

Если вы начинаете с этой главы, выполните следующие шаги, чтобы настроить простое веб-приложение, созданное с помощью Express и Pug, которое является основой для упражнений по безопасности в этой главе: b starter [email protected]:auth0-blog/wab-portal-express.git

Чтобы быстро скопировать команды, трижды щелкните их , чтобы выделить их полностью.

🛠️️ Make WAB-Portal-Express Текущий рабочий каталог:

  CD WAB-Portal-Express  

🛠️️ Установите зависимости проекта:

  NPM I  

🛠️️ Запустите сервер используя nodemon под капотом:

  npm run dev  

🛠️️ В отдельном окне терминала обслуживаем клиента со статического сервера используя Browsersync под капотом:

  npm run ui 
1 1 1 1 1 1 1 сервер работает на порту 8000 с nodemon . Ознакомьтесь с командами сценария npm, присутствующими в package.json , для получения более подробной информации.

🛠️️ Чтобы увидеть приложение в действии, посетите http://localhost:3000 в своем браузере.

Что вы создадите

Вы защитите портал входа в ресторан с именем WHATABYTE, используя Passport.js с Auth0:

Мы протестировали это руководство, используя Node.js v12.16.0 и npm v6.13.4 . Если вам нужно установить Node.js и npm, используйте любой из официальных пакетов Node.js для вашей операционной системы.

Настройка реальной аутентификации для Node.js

Основная цель этого руководства — научить вас, как настроить реальную аутентификацию в приложении Node.js Express. По этой причине вы начнете с настройки Auth0 для взаимодействия с реальным сервером аутентификации на протяжении всего руководства. В противном случае Passport.js выдает массу сообщений об ошибках в терминале, и приложение не запускается.

Auth0 — мировой лидер в области «Идентификация как услуга» (IDaaS).Его расширяемая платформа легко аутентифицирует и защищает более 2,5 миллиардов входов в систему в месяц, что делает ее любимой разработчиками и надежной компанией со всего мира.

Лучшая часть платформы Auth0 — это то, как легко начать работу, выполнив эти три простых шага.

Шаг 1: Зарегистрируйтесь и создайте приложение Auth0

🛠️️ Если вы новичок в Auth0, зарегистрируйте бесплатную учетную запись Auth0 здесь. Бесплатная учетная запись предлагает вам:

🛠️️ В процессе регистрации вы создадите что-то под названием Tenant , представляющее продукт или услугу, к которым вы добавляете аутентификацию — подробнее об этом чуть позже.

🛠️️ После входа в систему вас приветствует панель управления Auth0. В меню левой боковой панели нажмите «Приложения».

Какая связь между клиентами Auth0 и приложениями Auth0?

Допустим, у вас есть приложение React для обмена фотографиями под названием «Noddit». Затем вы должны создать арендатора Auth0 с именем noddit .

Теперь скажем, что Noddit доступен на трех платформах : веб как одностраничное приложение и как родное мобильное приложение для Android и iOS .Если для каждой платформы требуется аутентификация, вам необходимо создать три приложения Auth0 , чтобы предоставить продукту все необходимое для аутентификации пользователей на этой платформе.

🛠️️ Затем нажмите кнопку Создать приложение в представлении «Приложения». Откроется модальное окно «Создать приложение». Вы можете указать Имя для приложения и выбрать его тип :

Имя : WHATABYTE Express Portal

Тип приложения : Обычные веб-приложения

Создать 95. 07️

Загружается вкладка Quick Start на странице вашего приложения, где Auth0 предоставляет различные руководства, которые помогут вам приступить к работе с настройкой проекта. Если вам интересно, ознакомьтесь с кратким руководством по Node.js; в противном случае, продолжайте читать.

Шаг 2. Создайте коммуникационный мост между Express и Auth0

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

Как работает универсальный вход?

Вызов конечной точки GET /login из вашего приложения переводит ваших пользователей на страницу входа Auth0.

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

Посмотрите видео о том, как работает универсальный вход Auth0.

Ваш браузер не поддерживает видео HTML5.Вот ссылка на видео универсального входа вместо этого.

🛠️️ Чтобы настроить приложение Auth0, перейдите на вкладку Настройки . Оказавшись там, заполните следующие поля следующим образом:

  • 🛠️️ Разрешенные URL-адреса обратного вызова :
  http://localhost:3000/callback, http://localhost:8000/callback  
    7 Разрешенные URL-адреса выхода :
  http://localhost:3000/, http://localhost:8000/  

Если вы посмотрите на пакет .json , вы увидите, что в этом проекте можно запустить два сценария npm:

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

🛠️️ Сохраните эти настройки, прокрутив вниз и нажав Сохранить изменения .

Шаг 3: Добавьте переменные конфигурации Auth0 в Node.js

🛠️️ В каталоге проекта создайте скрытый файл с именем .env для хранения переменных конфигурации и секретов, которые нужны вашему приложению.

  touch .env  

Обязательно добавьте этот файл в .gitignore , чтобы он не был привязан к контролю версий .

🛠️️ Добавьте следующее в .env :

  AUTH0_CLIENT_ID=
AUTH0_DOMAIN=
Auth0_client_secret =  

🛠️️ Вернуться к вашему приложению AUTH0 Настройки Вкладка и заполните каждое свойство HiDDen файл .env с соответствующим значением приложения AUTH0:

  • 🛠️️ auth0_domain - ваш домен

Когда вы создали новую учетную запись с Auth0, вы выбрали имя для своего клиента.Это имя используется в качестве поддомена auth0.com и становится вашим уникальным доменом приложения Auth0. Это базовый URL-адрес, который вы используете для доступа к API Auth0, и URL-адрес, по которому ваше приложение перенаправляет пользователей на Auth0 для их аутентификации.

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

  • 🛠️️
    • 🛠️️
      • 🛠️️ auth0_client_id - это ваш клиент ID

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

      • 🛠️️ AUTH0_CLIENT_SECRET — это ваш секрет клиента

      Секрет клиента Auth0 является критическим значением, поскольку он защищает ваши ресурсы, предоставляя учетные данные, связанные с аутентификацией, только в виде токенов токена

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

      Вместе эти переменные позволяют вашему приложению идентифицировать себя как авторизованную сторону для взаимодействия с сервером аутентификации Auth0.

      Добавление аутентификации пользователя в приложение Express

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

      🛠️️ Для начала вам нужно создать конечную точку GET /login в вашем API, чтобы управлять всем, что связано с аутентификацией пользователя, что означает проверку личности пользователя.

      Сказать, что реализация аутентификации сложна, не будет преуменьшением. Сам процесс аутентификации относительно прост; однако сложно правильно и безопасно реализовать каждый шаг процесса и следовать рекомендациям, предложенным Open Web Application Security Project (OWASP), которые включают:

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

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

      🛠️️ Чтобы связать ваше приложение с Auth0, вы будете использовать SDK Node. js. Затем каждый раз, когда пользователь пытается пройти аутентификацию, сервер аутентификации Auth0 проверит его личность и отправит необходимую информацию обратно в ваше приложение.

      Использовать ПО промежуточного слоя для аутентификации

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

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

      Чтобы упростить реализацию аутентификации, вместо написания всего кода, необходимого для структурирования промежуточного программного обеспечения аутентификации, вы будете использовать Passport. js, простое и ненавязчивое промежуточное программное обеспечение аутентификации для Node.js, созданное Джаредом Хэнсоном, бывшим главным архитектором. на Auth0.

      Настройте Passport.js с Node и Express

      Как описано в Passport.js «Обзор», аутентификация принимает различные формы: пользователи могут войти в систему, указав имя пользователя и пароль, или выполнить единый вход с помощью поставщика OAuth, такого как Facebook или Twitter.

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

      🛠️️ Вы собираетесь использовать стратегию аутентификации Auth0 с Passport.js, чтобы вам не пришлось беспокоиться о создании учетных данных пользователя и управлении ими самостоятельно. Для начала установите следующие пакеты:

        npm ipassport-auth0 express-session dotenv  

      Вот разбивка каждого пакета, который вы устанавливаете: совместимое промежуточное ПО аутентификации для Node. js.

    • паспорт-auth0 : это стратегия аутентификации Auth0 для Passport.js.

    • экспресс-сеанс : Это модуль для создания промежуточного программного обеспечения сеанса и управления им.

    • dotenv : это модуль с нулевой зависимостью, который загружает переменные среды из файла .env в process.env .

    Настройка экспресс-сессии

    🛠️️ Далее открываем index.js и добавьте следующее в раздел Required External Modules :

     
    
    
    
    константный экспресс = требуется ("экспресс");
    постоянный путь = требуется ("путь");
    
    const expressSession = require("Экспресс-сеанс");
    const паспорт = требовать("паспорт");
    const Auth0Strategy = require("passport-auth0");
    
    требуют("dotenv").config();  

    Вы добавляете импорт для экспресс-сеанса , паспорт и паспорт-аутентификация0 , которые вы настроите в следующих разделах. Вы также используете dotenv для загрузки переменных среды, которые вы храните в .env .

    🛠️️ Между разделами App Variables и App Configuration создайте два новых раздела, Session Configuration и Passport Configuration :

     
    
    
    
    константное приложение = экспресс();
    постоянный порт = process.env.PORT || «8000»;
    
    
    
    
    
    
    
    
    
    
     
      

    Вопросы заказа в Express. Пожалуйста, убедитесь, что вы добавляете разделы в правильном порядке.

    🛠️️ В разделе Session Configuration настройте expressSession следующим образом:

     
    
    
    
    постоянный сеанс = {
      секрет: process.env.SESSION_SECRET,
      куки: {},
      пересохранить: ложь,
      saveUninitialized: ложь
    };
    
    если (app.get("env") === "производство") {
      
      session.cookie.secure = истина;
    }  

    expressSession принимает объект конфигурации, session , который определяет, какие параметры включить в сеансе. Здесь вы настраиваете следующие параметры:

    • секрет : это секрет, используемый для подписи файла cookie идентификатора сеанса, который может быть либо строкой для одного секрета, либо массивом из нескольких секретов.Вскоре вы создадите переменную окружения SESSION_SECRET .

    • cookie : Это объект настроек для cookie идентификатора сеанса. Значение по умолчанию: { путь: '/', httpOnly: true, secure: false, maxAge: null } . Вы устанавливаете это как пустой объект.

    • resave : Этот параметр принудительно сохраняет сеанс обратно в хранилище сеансов, даже если приложение не изменяет сеанс во время запроса.Для стратегии Auth0 Passport.js это значение должно быть false .

    • saveUninitialized : Это заставляет новый, но не измененный сеанс, неинициализированный , быть сохраненным в хранилище. Passport.js обрабатывает изменение сеанса, поэтому вы можете установить для него значение false . Если установлено значение true , когда ваша веб-страница сканируется ботами, она создает сеанс для них в дополнение к пользователям, которые только посещают вашу главную страницу, но не входят в систему, что использует больше сеансов и памяти.

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

    Теперь вам нужно создать секрет сеанса для приложения.

    🛠️ Откройте .env и добавьте переменную SESSION_SECRET и AUTH0_CALLBACK_URL ниже AUTH0_CLIENT_SECRET :

     9003..."
    AUTH0_DOMAIN="..."
    AUTH0_CLIENT_SECRET="..."
    SESSION_SECRET=
    AUTH0_CALLBACK_URL=http://localhost:3000/callback  

    🛠️ Выполните следующую команду, чтобы сгенерировать подходящую строку для секрета сеанса:

      node -e "console.log(crypto.randomBytes(32).toString('hex'))"  

    🛠️ Скопируйте и вставьте вывод команды выше как значение для SESSION_SECRET в . env .

    Вы узнаете, что AUTH0_CALLBACK_URL делает для вашего приложения после того, как вы настроите Passport.js в следующем разделе.

    🛠️ Перезапустите сервер, работающий на порту 8000 , чтобы Express мог распознать эти новые переменные. Затем обновите страницу, на которой работает пользовательский интерфейс. .

    Кроме того, когда ваше приложение работает как рабочий экземпляр, вы будете отправлять файлы cookie только через HTTPS:

      if (app.get("env") === "production") {
      
      session.cookie.secure = истина;
    }  

    Если для параметра session.cookie.secure задано значение true , совместимые клиенты не будут отправлять файлы cookie обратно на сервер, если браузер не имеет соединения HTTPS. Таким образом, для использования безопасных файлов cookie требуется веб-сайт с поддержкой HTTPS.

    🛠️️ Далее, в разделе Конфигурация приложения , скажите своему приложению Express использовать expressSession с только что созданным объектом session :

     
    
    
    
    приложение. set("views", path.join(__dirname, "views"));
    app.set("движок просмотра", "мопс");
    app.use(express.static(path.join(__dirname, "public")));
    
    app.use (expressSession (сеанс));  

    🛠️️ После настройки промежуточного программного обеспечения сеанса вы готовы добавить и настроить Passport.js в своем приложении.

    Настройте Passport с помощью параметров приложения

    В этом разделе вы сосредоточитесь на подключении Passport.js к вашему приложению Express.

    🛠️️ Импортировав Auth0Strategy , перейдите к определению этой стратегии в разделе Passport Configuration в указателе .js :

     
    
    
    
    константная стратегия = новая Auth0Strategy(
      {
        домен: процесс.env.AUTH0_DOMAIN,
        идентификатор клиента: process.env.AUTH0_CLIENT_ID,
        clientSecret: процесс.env.AUTH0_CLIENT_SECRET,
        callbackURL: process.env.AUTH0_CALLBACK_URL
      },
      function(accessToken, refreshToken, extraParams, profile, done) {
        
        вернуть готово (ноль, профиль);
      }
    );  

    Здесь метод Auth0Strategy принимает ваши учетные данные Auth0 и инициализирует стратегию. Важно понимать, что делает для вас Auth0Strategy :

    1. Функция обратного вызова, переданная методу Auth0Strategy , известна как обратный вызов Verification , целью которого является поиск пользователя, обладающего набором реквизиты для входа.

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

    3. Затем он вызывает обратный вызов Verify с данными аутентификации в качестве аргументов, в данном случае accessToken , refreshToken , extraParams и profile .

    4. Поскольку Passport.js является промежуточной функцией, обратный вызов Verify также получает done в качестве аргумента для передачи управления следующей промежуточной функции.

    5. Поскольку Auth0 выполняет всю проверку учетных данных за вас, обратный вызов Verify вызывает done для предоставления в Passport пользователя, который прошел аутентификацию через объект профиля .

    🛠️️ После определения стратегии вам нужно, чтобы Passport.js использовал ее. В приложениях Express вам также необходимо инициализировать Passport и изменить постоянный сеанс входа в систему с помощью Passport и метода app.use() из Express.Для выполнения этих задач обновите раздел App Configuration в index.js следующим образом:

     
    
    app.set("представления", path.join(__dirname, "представления"));
    app.set("движок просмотра", "мопс");
    app.use(express.static(path.join(__dirname, "public")));
    
    app.use (expressSession (сеанс));
    
    паспорт.использование(стратегия);
    app.use(passport.initialize());
    app.use(passport.session());  

    После привязки промежуточного программного обеспечения express-session expressSession(session(session) к промежуточному программному обеспечению уровня приложения необходимо убедиться, что passport.initialize() и passion. session() добавлены.

    Хранение и извлечение пользовательских данных из сеанса

    🛠️️ Последний шаг в настройке Passport.js — поддержка сеансов входа в систему путем сериализации и десериализации экземпляров пользователей в сеансе и из него. Чтобы интегрировать эту функцию, еще раз обновите раздел App Configuration следующим образом:

     .
    
    
    
    app.set("представления", path.join(__dirname, "представления"));
    app.set("движок просмотра", "мопс");
    app.use(express.static(path.join(__dirname, "public")));
    
    app.use (expressSession (сеанс));
    
    паспорт.использование (стратегия);
    app.use(passport.initialize());
    app.use(passport.session());
    
    паспорт.serializeUser((пользователь, готово) => {
      сделано (ноль, пользователь);
    });
    
    паспорт.deserializeUser((пользователь, готово) => {
      сделано (ноль, пользователь);
    });  

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

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

    «Несмотря на сложности, связанные с аутентификацией, код не должен быть сложным. Это философия Passport.js, которая предоставляет простое, ненавязчивое промежуточное ПО для аутентификации для Node.js»

    Tweet This

    Создание конечных точек экспресс-аутентификации

    🛠️️ В этом разделе вы создадите три конечные точки, которые обрабатывают поток аутентификации приложения:

      GET /login.
    
    ПОЛУЧИТЬ /выйти
    
    GET /callback  

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

    🛠️️ Для начала создайте файл auth.js в каталоге проекта.

      touch auth.js  

    Заполните его этим шаблоном, чтобы определить его структуру:

     
    
    
    
    
    
    
      

    🛠️️ Затем добавьте следующее в раздел Required External Modules , чтобы импортировать необходимые пакеты и загрузить переменные среды:

     
    
    
    
    константный экспресс = требуется ("экспресс");
    const router = express.Router();
    const паспорт = требовать("паспорт");
    const строка_запроса = требуется("строка_запроса");
    
    требуют("дотенв").конфиг();  

    Вот обзор новых модулей, которые вы используете:

    • маршрутизатор : Объект маршрутизатора — это изолированный экземпляр промежуточного программного обеспечения и маршрутов. Он способен выполнять только промежуточное ПО и функции маршрутизации. Каждое приложение Express имеет встроенный маршрутизатор приложений.

    • util : этот модуль предназначен для поддержки внутренних API-интерфейсов Node. js, предоставляя полезные служебные функции для выполнения таких задач, как форматирование и кодирование строк.

    • url : Этот модуль предоставляет утилиты для разрешения и анализа URL.

    • querystring : Этот модуль предоставляет утилиты для разбора и форматирования строк запросов URL.

    Вскоре вы увидите, как эти модули оптимизируют логику вашего контроллера маршрутов.

    🛠️️ Первая конечная точка, которую вы создадите, — это GET /login . Обновите раздел Routes Definitions вашего auth.js следующим образом:

     
    
    
    
    роутер.получить(
      "/авторизоваться",
      паспорт.аутентификация("auth0", {
        scope: "профиль электронной почты openid"
      }),
      (требование, разрешение) => {
        res.redirect("/");
      }
    );  

    🛠️️ GET /login выполняет вход пользователя. Эта конечная точка демонстрирует, как экспресс-маршрут может принимать несколько обратных вызовов после определения маршрута и пути (первый аргумент). Здесь вы передаете две функции обратного вызова:

    • Метод passport.authenticate() , который получает паспорт.js и объект options , который определяет область применения в качестве аргументов.

    • Пользовательский обратный вызов вызывается после завершения pass.authenticate() . Этот обратный вызов обрабатывает успешную или неудачную аутентификацию и выдает ответ клиенту.

    🛠️️ После того, как сервер аутентификации идентифицирует и проверяет пользователя, он вызывает конечную точку GET /callback из вашего API для передачи всех необходимых данных аутентификации.Реализуйте эту конечную точку, добавив следующее определение GET /callback в раздел Routes Definitions :

     
    
    
    
    router.get("/логин", ...);
    
    router.get("/callback", (req, res, next) => {
      паспорт.аутентификация("auth0", (ошибка, пользователь, информация) => {
        если (ошибка) {
          вернуть следующий (ошибка);
        }
        если (!пользователь) {
          вернуть res. redirect("/логин");
        }
        req.logIn(пользователь, (ошибка) => {
          если (ошибка) {
            вернуть следующий (ошибка);
          }
          константа returnTo = требуется.сеанс.returnTo;
          удалить req.session.returnTo;
          res.redirect (возврат в || "/");
        });
      })(запрос, разрешение, следующий);
    });  

    GET /callback выполняет последний этап аутентификации и перенаправляет на ранее запрошенный URL-адрес или /, если этот URL-адрес не существует. В пользовательской функции обратного вызова вы проверяете наличие ошибки err и определен ли объект пользователя . В случае ошибки вы передаете управление следующей промежуточной функции вместе с объектом ошибки.Если аутентификация не удалась, user является ложным, и вы перенаправляете пользователя обратно на страницу /login .

    Поскольку вы вызываете метод паспорта.authenticate() в контроллере маршрута, он имеет доступ к объектам запроса req и ответа res через замыкание. Если аутентификация прошла успешно, вы вызываете req.LogIn() , чтобы установить сеанс входа в систему. req.logIn() — это функция, предоставляемая Passport.js для объекта req .По завершении операции входа в объект req добавляется свойство user , содержащее всю информацию о пользователе.

    После установления сеанса входа в систему вы можете улучшить взаимодействие с пользователем, перенаправляя пользователей на страницу, которую они посещали до выполнения запроса аутентификации. Маршрут такой страницы — это значение req.session.returnTo , которое вы присваиваете переменной returnTo перед ее удалением. Если определено returnTo , вы перенаправляете пользователя на этот маршрут; в противном случае вы ведете их на страницу /user , которая в идеале должна предоставить пользователю их информацию.

    Вы можете перенаправить на любые другие маршруты.

    Как видите, GET /callback действует как мост между вашим приложением и сервером аутентификации Auth0. Используя Passport.js, вы можете упростить процесс создания сеанса входа и активного пользователя в своем приложении.

    🛠️️ Почти готово. Последней конечной точкой аутентификации, которую необходимо реализовать, является GET /logout , и она самая сложная. Добавьте следующее определение GET /logout в раздел Routes Definitions :

     
    
    
    
    маршрутизатор.получить("/логин", ...);
    
    router.get("/обратный вызов", ...);
    
    router.get("/logout", (req, res) => {
      req.logOut();
    
      пусть returnTo = req.protocol + "://" + req.hostname;
      постоянный порт = req.connection.localPort;
    
      if (порт !== не определено && порт !== 80 && порт !== 443) {
        вернуться к =
          process.env.NODE_ENV === "производство"
            ? `${возврат}/`
            : `${returnTo}:${порт}/`;
      }
    
      const logoutURL = новый URL(
        `https://${process. env.AUTH0_DOMAIN}/v2/выход из системы`
      );
    
      константная строка поиска = строка запроса.подстроить строку ({
        client_id: process.env.AUTH0_CLIENT_ID,
        вернуться к: вернуться к
      });
      logoutURL.search = строка поиска;
    
      res.redirect (URL-адрес выхода);
    });  

    Этот маршрут выполняет выход из сеанса и перенаправляет пользователя на домашнюю страницу.

    Passport.js также предоставляет функцию logOut() для объекта запроса, req , которую вы можете вызвать из любого контроллера маршрута, которому необходимо завершить сеанс входа в систему. Вызов req.logOut() удаляет req.user и очищает существующий сеанс входа в систему. После этого вы создаете URL-адрес, на который перенаправляются пользователи после завершения выхода, следующим образом:

    • Начните строку URL-адреса с протокола и имени хоста:
      let returnTo = req.protocol + "://" + req.hostname;  
    • Определите, используете ли вы локальный порт. Если порт не является ни undefined , ни номером порта по умолчанию для веб-серверов, использующих HTTP ( 80 ), ни портом по умолчанию для веб-серверов, использующих HTTPS ( 443 ), вы добавляете этот порт к строке URL returnTo если текущая среда Node development :
      const port = req.соединение.локальныйПорт;
    
    if (порт !== не определено && порт !== 80 && порт !== 443) {
      вернуться к =
        process.env.NODE_ENV === "производство"
          ? `${возврат}/`
          : `${returnTo}:${порт}/`;
    }  
    • Используйте конструктор Node.js URL() вместе с util.format() , чтобы вернуть отформатированную строку, заменив спецификаторы формата (символы, которым предшествует знак процента, % ) на соответствующий аргумент. В этом случае спецификатор строки %s заменяется значением процесса .env.AUTH0_DOMAIN . Вы установите переменные Auth0 в следующем разделе.
      const logoutURL = новый URL(
      `https://${process.env.AUTH0_DOMAIN}/v2/выход из системы`
    );  
    • Используя querystring.stringify , создайте строку запроса URL из объекта, который содержит идентификатор клиента Auth0 и URL-адрес returnTo :
      const searchString = querystring.stringify({
      client_id: process.env.AUTH0_CLIENT_ID,
      вернуться к: вернуться к
    });  
    • Использование URL-адреса .search , получить и установить сериализованные части запроса logoutURL :
      logoutURL.search = searchString;  
    • Наконец, перенаправьте пользователя на logoutURL :
      res.redirect(logoutURL);  

    Конечная точка GET /logout не слишком длинная, но довольно сложная. Он использует различные API-интерфейсы Node для динамического построения пути выхода в зависимости от активной среды Node, порта, который использует сервер, и переменных конфигурации.

    🛠️️ Все конечные точки API аутентификации завершены. Теперь вам нужно экспортировать маршрутизатор и использовать его с приложением Express. Сначала добавьте эту строку в раздел Module Exports файла auth.js :

     .
    
    
    
    модуль.экспорт = маршрутизатор;  

    🛠️️ Затем откройте index.js и импортируйте маршрутизатор аутентификации в раздел Required External Modules :

     
    
    
    
    константный экспресс = требуется ("экспресс");
    постоянный путь = требуется ("путь");
    
    const expressSession = require("Экспресс-сеанс");
    const паспорт = требовать("паспорт");
    const Auth0Strategy = require("passport-auth0");
    
    требуют("дотенв").конфиг();
    
    const authRouter = require("./auth");  

    🛠️️ Теперь смонтируйте authRouter по корневому пути / вашего приложения Express, обновив раздел App Configuration следующим образом:

     
    
    
    
    app.set("представления", path.join(__dirname, "представления"));
    app.set("движок просмотра", "мопс");
    app.use(express.static(path.join(__dirname, "public")));
    
    app.use (expressSession (сеанс));
    
    паспорт.использование(стратегия);
    app.use(passport.initialize());
    app.use(паспорт.сеанс());
    
    паспорт.serializeUser( ... );
    
    паспорт.deserializeUser( ... );
    
    
    app.use("/", authRouter);  

    🛠️️ У вас есть конечная точка GET /login , но у вас нет кнопки входа. Обновите views/index.pug , чтобы включить его:

      расширяет макет
    
    блочный макет-контент
      div.View.WelcomeView
        h2.Баннер WHATABYTE
        div.Сообщение
          div.Название
            h4 Делая все возможное
            h2 Пища для разработчиков
          span.Details Доступ к командному порталу WHATABYTE
        разд.навигационные кнопки
          если авторизован
            а(href="/пользователь")
              div.NavButton Просто погрузитесь!
          еще
            а(href="/логин")
              div.NavButton Войдите в систему  

    Теперь, когда вы нажимаете кнопку входа в систему на странице индекса, вызывается конечная точка GET /login . Как упоминалось ранее, конечная точка /login предоставляет пользователю страницу входа, но где эта страница? При использовании Auth0 в качестве платформы для идентификации вам не нужно создавать страницу входа в систему, Auth0 предоставляет ее с надлежащей формой и безопасными сообщениями и подсказками об ошибках аутентификации.

    🛠️️ Последнее, что вам нужно сделать, это смонтировать промежуточную функцию на уровне приложения, чтобы определить значение переменной isAuthenticated , используемой в шаблоне index.pug .

    Создайте пользовательское промежуточное ПО с помощью Express

    🛠️️ В index.js обновите раздел App Configuration , чтобы дополнить объект ответа res данными с сервера аутентификации. Сделайте это прямо над креплением маршрутизатора аутентификации:

     
    
    
    
    приложение.set("views", path.join(__dirname, "views"));
    app.set("движок просмотра", "мопс");
    app.use(express.static(path.join(__dirname, "public")));
    
    app.use (expressSession (сеанс));
    
    паспорт.использование(стратегия);
    app.use(passport.initialize());
    app.use(passport.session());
    
    паспорт.serializeUser( ... );
    
    паспорт.deserializeUser( ... );
    
    
    app.use((req, res, next) => {
      res.locals.isAuthenticated = req.isAuthenticated();
      следующий();
    });
    
    app.use("/", authRouter);  

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

    Теперь кнопка на индексной странице может изменять свое содержимое в зависимости от того, вошел ли пользователь в систему с помощью Auth0 или нет.

     
      

    Войдите в приложение Node.js Express

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

    🛠️️ Если вы все настроили правильно, приложение перенаправит вас на страницу универсального входа.

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

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

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

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

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

    🛠️️ После того, как вы зарегистрируетесь или войдете в систему, Auth0 вернет вас на домашнюю страницу вашего приложения Express.

    Обратите внимание, что метка кнопки на домашней странице изменилась с Войти на Просто погрузитесь! , что означает, что приложение успешно аутентифицировало вас.

    Доступ к защищенным маршрутам

    В своем приложении вы защищаете конечную точку GET /user с помощью промежуточного программного обеспечения Passport.js, чтобы предотвратить переход к ней, если приложение не аутентифицировало пользователя. Поскольку вы вошли в систему, при нажатии кнопки Just Dive In! , которая указывает на /user , вы успешно перешли к этому представлению. В случае, если вы вышли из системы, при попытке доступа к маршруту /user вы попадете на экран входа в систему Auth0.

    🛠️️ Для начала создайте промежуточную функцию с именем secure для защиты вашего маршрута /user и убедитесь, что он доступен только в том случае, если пользователь вошел в систему. В разделе Routes Definitions файла index.js , добавьте следующую функцию промежуточного программного обеспечения :

     
    
    
    
    const secure = (req, res, next) => {
      если (треб. пользователь) {
        вернуть следующий();
      }
      req.session.returnTo = req.originalUrl;
      res.redirect("/логин");
    };
    
    
    приложение.получить("/", ... );
    
    app.get("/пользователь", ...);  

    🛠️️ Затем, все еще в разделе Routes Definitions , рефакторинг контроллера GET /user , чтобы он использовал эту промежуточную функцию следующим образом:

     
    
    
    
    const secure = (req, res, next) => { ... };
    
    app.get("/", ...);
    
    app.get("/user", защищенный, (req, res, следующий) => {
      const { _raw, _json, ...userProfile } = req.user;
      res.render ("пользователь", {
        заголовок: "Профиль",
        профиль пользователя: профиль пользователя
      });
    });  

    Вы используете деструктуризацию объекта Javascript для распаковки значений из req.объект пользователя в отдельные переменные. Используя необязательный объектный аргумент метода res.render() , вы передаете переменную userProfile в шаблон представления пользователя вместе с заголовком страницы.

    🛠️️ Посетите http://localhost:3000/user в браузере, если вы вошли в систему, теперь вы видите свой псевдоним в приветственном баннере и объект userProfile , отображаемый в формате JSON в контейнере содержимого.

    🛠️️ Если вы нажмете на кнопку Выйти , приложение перенесет вас на главную страницу.Посетите http://localhost:3000/user еще раз, и вы попадете на страницу входа, предоставленную Auth0. Войдите снова, и вы вернетесь на страницу пользователя.

    «Узнайте, как настроить Node.js и экспресс-аутентификацию с помощью Passport.js и Auth0».

    Твитнуть это

    Интеграция аутентификации завершена

    Готово! Из этого руководства вы узнали, как работает Passport.js, как его настроить и как интегрировать с Node.js и Auth0, чтобы добавить аутентификацию в веб-приложения.Вы также узнали о передовых методах обеспечения безопасности и идентификации и о том, как платформа идентификации, такая как Auth0, позволяет делегировать команде экспертов гигантскую ответственность за обеспечение безопасности входа в систему.

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

    Спасибо за ваше время!

    Я столкнулся с проблемой

    Аутентификация в React с использованием Express, Node, Passport и MongoDB

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

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

    Мы будем использовать:

    • Passport как промежуточное ПО для Node.js.
    • MongoDB для хранения сведений о пользователе.
    • JWT для идентификации запроса пользователя.
    • Жетоны обновления для обновления JWT.

    Архитектура приложения

    Вот как будет выглядеть наш процесс входа в систему:

    Вот как будет выглядеть аутентифицированный запрос:

    Зачем нужны токены JWT и Refresh и что такое тихое обновление?

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

    Проблема с коротким сроком действия JWT заключается в том, что пользователь будет часто выходить из системы, что определенно не очень удобно для пользователя.Чтобы решить эту проблему, мы вводим токены обновления с очень длительным сроком действия (скажем, 30 дней). В отличие от JWT, токен обновления хранится в файле cookie, который создается на сервере (только HTTP, безопасный). таким образом предотвращается чтение любым уязвимым javascript файла cookie refreshToken (XSS-атака).

    Токены обновления создаются и сохраняются в базе данных во время входа/регистрации и записываются в файл cookie. После каждого короткого интервала (скажем, 5 минут, что меньше времени истечения JWT), Конечная точка /refreshToken будет вызываться в фоновом режиме ( Silent Refresh ) для обновления как JWT, так и refreshToken , как показано ниже:

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

    Почему JWT хранится в памяти? Почему не локальное хранилище?

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

    Вы можете прочитать замечательную статью, описывающую, почему отказ от LocalStorage для токенов является неправильным решением

    Почему не используются файлы cookie SameSite?

    Вам может быть интересно, почему бы не использовать один файл cookie SameSite с HTTPOnly и Secure для хранения сеанса пользователя? Проблема с этим подходом:

    • Файлы cookie SameSite требуют, чтобы клиент и сервер находились в одном домене.Поэтому, если ваш клиент развернут в другом домене, вы не сможете его использовать.
    • Файлы cookie SameSite реализованы не полностью в некоторых браузерах.

    Другие преимущества использования JWT:

    • Поскольку JWT не нужно проверять по базе данных, он повышает производительность, избегая обращения к базе данных в каждом запросе.
    • Поскольку JWT хранится на стороне клиента, он помогает предотвратить атаки XSRF/CSRF.

    Реализация на стороне сервера

    Создать новый узел.js с помощью следующей команды:

    Откройте каталог, в котором вы запустили указанную выше команду, в своем любимом редакторе кода, обновите файл package.json с помощью сценария запуска:

    package.json

     

    1{

    2 "имя": "mern-auth-server",

    3 "версия": "1.0.0",

    4 "описание": "",

    5 "main": "index.js",

    6 "scripts": {

    7 "start": "node index.js",

    8 "test": "echo \"Ошибка: тест не указан\" && выход 1"

    9 },

    10 "ключевые слова": [],

    11 "автор": "",

    12 "лицензия": "ISC"

    13}

    Теперь выполните следующую команду для установки пакетов:

     

    1yarn добавить экспресс-парсер dotenv mongoose body-parser cors cookie-parser

    • экспресс — используется для создания веб-фреймворка с помощью Node.js.
    • dotenv — загружает переменные среды из файла .env .
    • мангуст — ODM для mongoDB.
    • body-parser — анализирует тело запроса из таких запросов, как POST-запрос.
    • cors — включение политик CORS для URL-адреса клиента.
    • cookie-parser — для создания и чтения файла cookie refreshToken .

    Теперь давайте создадим файл с именем .env в корневом каталоге проекта. В этом файле будут все конфигурации и секреты, используемые сервером.Вы встретите эти переменные в этом посте.

     .env 

    1JWT_SECRET = jdhdhd-kjfjdhrhrerj-uurhr-jjge

    2REFRESH_TOKEN_SECRET = fgkjddshfdjh773bdjsj84-jdjd774

    3SESSION_EXPIRY = 60 * 15

    4REFRESH_TOKEN_EXPIRY = 60 * 60 * 24 * 30

    5MONGO_DB_CONNECTION_STRING = MongoDB: //127.0. 0.1:27017/mern_auth

    6COOKIE_SECRET = jhdshhds884hfhhs-ew6dhjd

    7WHITELISTED_DOMAINS = http://localhost:3000

    .env файлы с производственными секретами не должны помещаться в кодовую базу. В развернутой среде задайте переменные среды в конфигурации сервера.

    Создайте каталог с именем utils и создайте в нем файл с именем connectdb.js :

    Connectdb.js

     

    1Const Mongoose = Требуется («Монтон»)

    2CONST URL = Process.env.mongo_db_connection_string

    3Const Connect = Mongoose.Connect (URL, {

    4 UREWURLPARSER: TRUE,

    5 USERALPARSERTTOPOLY: true,

    6 useCreateIndex: true,

    7})

    8connect

    9 .then(db => {

    10 console.log("подключен к db")

    11 })

    12 .catch(err => {

    13 console.log(err)

    14 })

    3

    2

    Как следует из названия, это помогает подключиться к экземпляру MongoDB, указанному в файле .env . Вы можете использовать либо локальный экземпляр, либо подключиться к облачному провайдеру, такому как MongoDB Atlas.

    Теперь создайте файл с именем index.js со следующим кодом:

    индекс

    .js

     

    1const express = require("express")

    2const cors = require("cors")

    3const bodyParser = require("body-parser")

    4const cookieParser = require("cookie-parser")

    5

    6if (process.env.NODE_ENV !== "production") {

    7

    8 require("dotenv").config()

    9}

    10require("./utils/connectdb")

    11

    12const приложение = экспресс()

    13

    14прил.use(bodyParser.json())

    15app.use(cookieParser(process.env.COOKIE_SECRET))

    16

    17

    18

    19const белый список = process.env.WHITELISTED_DOMAINS

    20 ? process.env.WHITELISTED_DOMAINS.split(",")

    21 : []

    22

    23const corsOptions = {

    24 origin: function (origin, callback) {

    25 if (!origin || whitelist.indexOf(origin) !== -1) {

    26 callback(null, true)

    27 } else {

    28 обратный вызов (новая ошибка («Не разрешено CORS»))

    29 }

    30 },

    31

    32 учетные данные: правда,

    33}

    34

    35прил.использовать (cors (corsOptions))

    36

    37app.get("/", function (req, res) {

    38 res.send({статус: "успешно"})

    39})

    40

    41

    42

    43const server = app.listen(process.env.PORT || 8081, function () {

    44 const port = server.address().port

    45

    46 console.log("Приложение запущено на порту:", порт)

    47})

    Здесь мы запускаем сервер на порту 8081 и подключаем маршрут / с успешным ответом.

    Запустите сервер с помощью следующей команды (вы можете использовать npm start или nodemon):

    Теперь в консоли вы должны увидеть следующий вывод:

    Если вы откроете URL-адрес http://localhost:8081 в браузере или почтальоне, вы увидите ответ об успешном завершении, как показано ниже:

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

    Паспорт js

    Passport — это промежуточное ПО Node.js, используемое для аутентификации.В нем написаны разные стратегии, основанные на типе аутентификации, который мы хотели бы использовать. Он имеет стратегии для локальной аутентификации с использованием имени пользователя и пароля, а также для входа в социальные сети, такие как Google и Facebook.

    Установка пакетов, связанных с паспортом

    Давайте установим следующие пакеты:

     

    1пряжа добавить паспорт паспорт-jwt паспорт-местный паспорт-местный-мангуст jsonwebtoken

    • паспорт-jwt — стратегия паспорта для аутентификации с использованием JWT для дальнейших запросов после входа/регистрации.
    • паспорт-местный — стратегия паспорта для аутентификации с использованием имени пользователя и пароля при входе в систему и регистрации.
    • паспорт-локальный-мангуст — плагин Mongoose, который помогает в создании имени пользователя и пароля для входа с использованием паспорта.
    • jsonwebtoken — помогает в создании и проверке JWT.

    Создание пользовательской модели

    Теперь давайте создадим модель пользователя. Создайте папку с именем models и файл с именем user.js внутри нее со следующим кодом:

    пользователя.js

     

    1const mongoose = require("mongoose")

    2const Schema = mongoose.Schema

    3

    4const паспортЛокальныйМангуст = требуется("паспорт-местный-мангуст")

    5

    6const Session = new Schema({

    7 refreshToken: {

    8 тип: строка,

    9 по умолчанию: "",

    10 },

    11})

    2

    13Const User = Новая схема ({

    14 Именные данные: {

    15 Тип: строка,

    16 по умолчанию: "",

    17},

    18 lastname: {

    19 Тип: {

    19 Тип: Строка,

    20 по умолчанию: "",

    21 },

    22 authStrategy: {

    23 тип: строка,

    24 по умолчанию: "local",

    25 },

    72

    9000 тип: {

    72

    ,

    28 по умолчанию: 50,

    29 },

    30 refreshToken: {

    31 тип: [Сеанс],

    32 },

    33})

    3 90

    35

    36Пользователь.set("toJSON", {

    37 transform: function (doc, ret, options) {

    38 delete ret.refreshToken

    39 return ret

    40 },

    41})

    42

    43User.plugin(passportLocalMongoose)

    44

    45module.exports = mongoose.model («Пользователь», Пользователь)

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

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

    Плагин

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

    Создание локальной стратегии

    Теперь создадим локальную стратегию, которая будет использоваться при входе и регистрации:

    Создайте папку с именем стратегий и файл с именем LocalStrategy.js внутри него. Локальная стратегия использует методы, предоставляемые паспортом-локальным-мангустом , для аутентификации и сериализации пользователя.

    LocalStrategy.js

     

    1const паспорт = требовать("паспорт")

    2const LocalStrategy = требовать("локальный паспорт").Стратегия

    3const Пользователь = требовать("../модели/пользователь")

    4

    5

    6passport.use(new LocalStrategy(User.authenticate()))

    7

    8

    9паспорт.сериализовать пользователя (пользователь. сериализовать пользователя ())

    Создание стратегии JWT

    Аналогично локальной стратегии, создайте файл с именем JwtStrategy.js внутри папки стратегий со следующим кодом:

    JwtStrategy.js

     

    1const паспорт = требовать("паспорт")

    2const JwtStrategy = требовать("паспорт-jwt").Стратегия,

    3 ExtractJwt = требовать("паспорт-jwt").ExtractJwt

    3 40const Пользователь = требуется("../модели/пользователь")

    5

    6const opts = {}

    7opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken()

    8opts.secretOrKey = process.env.JWT_SECRET

    9

    10

    11

    12

    12Passort.use (

    13 Новая JWTSTSTRATEGY (OPTS, Функция (JWT_PAYLOAD, сделано) {

    14

    15

    16 User.Findone ({_id: jwt_payload._id}, функция ( err, user) {

    17 if (err) {

    18 return done(err, false)

    19 }

    20 if (user) {

    21 return done(null, user)

    else 22 {

    23 return done(null, false)

    24

    25 }

    26 })

    27 })

    28)

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

    Создание функций, связанных с аутентификацией

    Теперь давайте создадим несколько функций, используемых для аутентификации. Создайте файл с именем authentication.js внутри корневого каталога со следующим кодом:

    .

    authentication.js

     

    1const паспорт = требовать ("паспорт")

    2const jwt = требовать ("jsonwebtoken")

    3const dev = процесс.env.NODE_ENV !== "производство"

    4

    5Exports.Cookie_Options = {

    6 Httpnly: True,

    7

    8

    8

    9 Безопасное :! dev,

    10 Подписано: true,

    11 maxage: eval (process.env.refresh_token_expiry) * 1000 ,

    12 тот же сайт: "нет",

    13}

    14

    15exports.getToken = user => {

    16 return jwt.sign(user, process.env.JWT_SECRET, {

    17 expiresIn: eval(process.env.SESSION_EXPIRY),

    18 })

    19}

    20

    21Exports.getrefreshtoken = User => {

    22 const Refreshtoken = jwt.sign (пользователь, process.env.refresh_token_secret, {

    23 Expiresin: Eval (process.env.refresh_token_expiry),

    24})

    25 вернуть refreshToken

    26}

    27

    28exports.verifyUser = паспорт.аутентификация("jwt", {сеанс: ложь})

    • COOKIE_OPTIONS используется для создания файла cookie токена обновления, который должен быть httpOnly и безопасным, чтобы он не мог быть прочитан клиентским javascript.Для SameSite установлено значение «Нет», поскольку клиент и сервер будут находиться в разных доменах.
    • getToken используется для создания JWT.
    • getRefreshToken используется для создания токена обновления, который сам по себе является JWT.
    • verifyUser — это промежуточное ПО, которое необходимо вызывать для каждого аутентифицированного запроса.

    Создание пользовательского маршрутизатора

    Создайте папку с именем route и файл с именем userRoutes.js внутри нее со следующим кодом:

    пользовательских маршрута.js

     

    1const express = require("express")

    2const router = express.Router()

    3const User = require("../models/user")

    4

    5const { getToken, COOKIE_OPTIONS, getRefreshToken } = require("../authenticate")

    6

    7router.post("/signup", (req, res, next) => {

    8

    9 if (!req.body.firstName) {

    10 res.statusCode = 500

    11 рез. send({

    12 name: "FirstNameError",

    13 message: "Требуется имя",

    14 })

    15 } else {

    16 Пользователь.register(

    17 новый пользователь ({ имя пользователя: req.body.username }),

    18 req.body.password,

    19 (ошибка, пользователь) => {

    20 если (ошибка) {

    21 res.statusCode = 500

    22 res.send(err)

    23 } else {

    24 user.firstName = req.body.firstName

    25 user.lastName = req.body.lastName || ""

    26 const token = getToken({ _id: user._id })

    27 const refreshToken = getRefreshToken({ _id: user._id })

    28 user.refreshToken.push({ refreshToken })

    29 user.save((ошибка, пользователь) => {

    30 if (ошибка) {

    31 res.statusCode = 500

    3

    res.send(err)

    33 } else {

    34 res.cookie("refreshToken", refreshToken, COOKIE_OPTIONS)

    35 res.send({ успех: true, token })

    36 }

    3 90 } )

    38 }

    39 }

    40 )

    41 }

    42})

    43

    44модуль.экспорт = маршрутизатор

    Здесь мы определяем маршрут /signup для регистрации. Он вызывает функцию register из плагина паспорта-локального-мангуста с имя пользователя и пароль и обратный вызов, который будет вызван после регистрации пользователя.

    Когда пользователь успешно зарегистрирован, мы генерируем токен аутентификации (JWT) и токен обновления. Мы сохраняем имя и фамилию в базе данных вместе с токеном обновления.При успешном сохранении сведений в базе данных создается файл cookie refreshToken и маркер аутентификации (JWT) отправляется в теле ответа.

    Теперь давайте включим все эти файлы в index.js :

    index.js

     

    1const express = require("express")

    2const cors = require("cors")

    3const bodyParser = require("body-parser")

    4const cookieParser = require("cookie- парсер")

    5const паспорт = требовать("паспорт")

    6

    7if (процесс.env.NODE_ENV !== "production") {

    8

    9 require("dotenv").config()

    10}

    11require("./utils/connectdb")

    12

    13require("./strategies/JwtStrategy")

    14require("./strategies/LocalStrategy")

    15require("./authenticate")

    16

    17const userRouter = require("./routes/userRoutes")

    18

    19const приложение = экспресс()

    20

    21app.use(bodyParser.json())

    22app.use(cookieParser(process.env.COOKIE_SECRET))

    23

    24

    25

    26const белый список = process.env.WHITELISTED_DOMAINS

    27 ? process.env.WHITELISTED_DOMAINS.split(",")

    28 : []

    29

    30const corsOptions = {

    31 origin: function (origin, callback) {

    32 if (!origin || whitelist.indexOf(origin) !== -1) {

    33 callback(null, true)

    34 } else {

    35 обратный вызов (новая ошибка («Не разрешено CORS»))

    36 }

    37 },

    38

    39 учетные данные: правда,

    40}

    41

    42прил.использовать (cors (corsOptions))

    43

    44app.use(passport.initialize())

    45

    46app.use("/пользователи", userRouter)

    47

    48app.get("/", function (req, res) {

    49 res.send({статус: "успешно"})

    50})

    51

    52

    53

    54const server = app.listen(process.env.PORT || 8081, function () {

    55 const port = server.address().port

    56

    57 консоль.log("Приложение запущено на порту:", порт)

    58})

    Тестирование с помощью почтальона

    Теперь, если вы сделаете почтовый запрос на URL-адрес: http://localhost:8081/users/signup, с username , password , firstName и lastName , вы сможете увидеть токен, сгенерированный в ответе.

    Если вы нажмете на Cookies, вы сможете увидеть файл cookie refreshToken :

    Если вы проверите базу данных, вы сможете увидеть созданную там запись пользователя:

    Создание маршрута входа

    Теперь, когда у нас есть способ зарегистрировать пользователя, давайте добавим маршрут входа в userRoutes.js :

    userRouter.js

     

    1const express = require("express")

    2const router = express.Router()

    3const User = require("../models/user")

    4const паспорт = require(" паспорт")

    5

    6const { getToken, COOKIE_OPTIONS, getRefreshToken } = require("../authenticate")

    7

    8

    9

    10router.post("/login",passport.authenticate("local"), (req, res, next) => {

    11 const token = getToken({ _id: req.user._id })

    12 const refreshToken = getRefreshToken({ _id: req.user._id })

    13 User.findById(req.user._id).then(

    14 user => {

    15 user .refreshToken.push({ refreshToken})

    16 user.save((ошибка, пользователь) => {

    17 если (ошибка) {

    18 res.statusCode = 500

    19 res.send(ошибка)

    20 } else {

    21 res.cookie("refreshToken", refreshToken, COOKIE_OPTIONS)

    22 рез.send({ успех: истина, токен })

    23 }

    24 })

    25 },

    26 err => следующий(ошибка)

    27 )

    28}) 90 90

    30module.exports = маршрутизатор

    Здесь мы подключаем локальную стратегию аутентификации, вызывая pass.authenticate("local") . Только если учетные данные действительны, тогда управление будет передано в тело маршрута входа. Если пользователь успешно вошел в систему, мы генерируем токен аутентификации и токен обновления.Мы сохраняем токен обновления в базе данных и устанавливаем его в файле cookie ответа. Маркер аутентификации (JWT) будет отправлен в теле ответа, чтобы клиент мог прикрепить его к последующему запросу.

    Если мы проверим его с помощью почтальона, вы сможете увидеть ответ, как показано ниже:

    Если вы предоставили неверные учетные данные, вы получите ответ «Неавторизованный» с кодом ответа 401.

    Создание маршрута refreshToken

    Ранее мы видели, что будем выполнять автоматическое обновление, вызывая конечную точку /refreshToken , чтобы получить новый токен аутентификации (JWT).Теперь давайте обновим userRoutes.js с помощью /refreshToken route:

    userRoutes.js

     

    1

    2const jwt = требуется ("jsonwebtoken")

    3

    4

    5

    6router.post("/refreshToken", (req, res, next) => {

    7 const { signedCookies = {} } = req

    8 const { refreshToken } = signedCookies

    9

    10 if (refreshToken) {

    11 try {

    12 const payload = jwt.Verify(refreshToken, process.env.REFRESH_TOKEN_SECRET)

    13 const userId = payload._id

    14 User.findOne({ _id: userId }).then(

    15 user => {

    16 if (user) {

    17

    18 const tokenIndex = user.refreshToken.findIndex(

    19 item => item.refreshToken === refreshToken

    20 )

    21

    22 если (tokenIndex === -1) {

    23 рез.statusCode = 401

    24 res.send ("Unauthorized")

    25 } else {

    26 const token = getToken ({ _id: userId })

    27

    28 const newRefreshToken = )

    29 user.refreshToken[tokenIndex] = { refreshToken: newRefreshToken }

    30 user.save((ошибка, пользователь) => {

    31 если (ошибка) {

    32 рез.statusCode = 500

    33 res.send(err)

    34 } else {

    35 res.cookie("refreshToken", newRefreshToken, COOKIE_OPTIONS)

    36 res.send({ успех: true, token 0) 37}

    38})

    39}

    39}

    40} else {

    41 res.statuscode = 401

    42 res.send ("несанкционировано")

    43}

    44},

    45 Err = > следующий(ошибка)

    46 )

    47 } ловить (ошибка) {

    48 рез.statuscode = 401

    49 res.send ("несанкционирован")

    50}

    51} else {

    52 RES.StatusCode = 401

    53 RES.Send («Несанкционированный»)

    54}

    55 })

    56

    57

    Здесь,

    • Мы извлекаем токен обновления из подписанных файлов cookie.
    • Мы сверяем токен обновления с секретом, использованным для создания токена обновления, и извлекаем из него полезную нагрузку (содержащую идентификатор пользователя).
    • Затем мы определяем, существует ли еще токен обновления в базе данных. (в случае выхода из системы со всех устройств все токены обновления, принадлежащие пользователю, будут удалены, и пользователь будет вынужден снова войти в систему).
    • Если он существует в базе данных, мы заменяем его вновь созданным токеном обновления.
    • Аналогично шагам входа и регистрации, здесь также мы будем устанавливать токен обновления в файле cookie ответа и токен аутентификации (JWT) в теле ответа.

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

    Конечная точка для получения сведений о пользователе

    Теперь у нас есть конечная точка для получения сведений о вошедшем в систему пользователе:

    USERTER.JS

     

    1

    1

    2CONST {

    3 Gettoken,

    4 Cookie_Options,

    5 Getrefreshtoken,

    6 VerifyUser,

    7} = Требовать ("../uctife")

    8

    9

    10маршрутизатор.get("/me", verifyUser, (req, res, next) => {

    11 res.send(req.user)

    12})

    13

    14

    Здесь мы вызываем промежуточное ПО verifyUser , которое, в свою очередь, вызывает стратегию JWT для проверки JWT и получения сведений о пользователе. Если вы не получаете данные о пользователе внутри стратегии JWT, то вы можете явно получить его в теле маршрута, перед отправкой сведений о пользователе в ответе.

    Чтобы получить данные пользователя, вам необходимо передать токен аутентификации (JWT), полученный в ответе на вход/регистрацию в почтальоне, как показано ниже:

    Создание маршрута выхода

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

    userRouter.js

     

    1

    2router.get("/logout", verifyUser, (req, res, next) => {

    3 const { signedCookies = {} } = req

    4 const { refreshToken } = signedCookies

    5 User.findById(req.user._id).then(

    6 user => {

    7 const tokenIndex = user.refreshToken.findIndex(

    8 item => item.refreshToken === refreshToken

    9 )

    10

    11 если (tokenIndex !== -1) {

    12 пользователь.refreshToken.id(user.refreshToken[tokenIndex]._id).remove()

    13 }

    14

    15 user.save((ошибка, пользователь) => {

    16 if (ошибка) {

    17 res.statusCode = 500

    18 res.send(ошибка)

    19 0 res } else {

    3 .clearCookie("refreshToken", COOKIE_OPTIONS)

    21 res.send({ успех: true })

    22 }

    23 })

    24 },

    25 err) => 0 0 0 r 3 2 9 след.

    27})

    28

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

    Реализация внешнего интерфейса

    Создайте новый проект реакции, используя следующую команду

     

    1npx создать-реагировать-приложение mern-auth-client

    Добавление BlueprintJS для стилизации

    Мы будем использовать BlueprintJS для оформления приложения. Итак, давайте установим его:

     

    1 пряжа добавить @blueprintjs/core

    В индексе .css , давайте включим файлы css, связанные с BlueprintJS:

    index.css

     

    1@import "~normalize.css";

    4body {

    5 поле: 0 авто;

    6 максимальная ширина: 400 пикселей;

    7}

    Также обратите внимание, что мы добавили стили для выравнивания содержимого страницы по центру.

    Создание компонентов входа и регистрации

    Теперь давайте создадим компоненты Login и Registration с помощью BlueprintJS:

    Login.js

     

    1импортировать {Button, FormGroup, InputGroup} из "@blueprintjs/core"

    2импортировать React, {useState} из "реагировать"

    3

    4const Login = () => {

    5 const [email, setEmail] = useState("")

    6 const [пароль, setPassword] = useState("")

    7

    8 return (

    9 <>

    10

    11

    12

    13 placeholder="Email"

    15 type="email"

    16 value={email}

    17 onChange={e => setEmail(e.target.value)}

    18 />

    19

    20

    21

    22

    2

    24 type="password"

    25 value={пароль}

    26 onChange={e => setPassword(e.target.value)}

    27 />

    28

    29 < намерение = «основной» тип заполнения = «отправить» текст = «Войти» />

    30

    31

    32 )

    33}

    34

    35экспорт по умолчанию Логин

    Здесь у нас есть поля имени пользователя и пароля и кнопка отправки.Мы используем локальные состояния для хранения значения электронной почты и пароля и мы подключили их к обработчикам изменений.

    Добавим поля для формы:

    index.css

     

    1@import "~normalize.css";

    4body {

    5 поле: 0 авто;

    6 максимальная ширина: 400 пикселей;

    7}

    8

    9.auth-form {

    10 margin-top: 10px;

    11}

    Аналогично создадим страницу регистрации:

    Регистр.js

     

    1импортировать {Button, FormGroup, InputGroup} из "@blueprintjs/core"

    2импортировать React, {useState} из "реагировать"

    3

    4const Register = () => {

    5 const [firstName, setFirstName] = useState("")

    6 const [lastName, setLastName] = useState("")

    7 const [email, setEmail] = useState("")

    8 const [пароль, setPassword] = useState("")

    9

    10 return (

    11 <>

    12

    13

    14

    17 onChange={e => setFirstName(e.target.value)}

    18 value={firstName}

    19 />

    20

    21

    22 3 2

    24 placeholder="Фамилия"

    25 onChange={e => setLastName(e.target.value)}

    26 value={lastName}

    27 />

    28

    3

    3

    30

    31

    32 type="email"

    33 placeholder="Email"

    34 onChange={e => setEmail(e.target.value)}

    35 value={email}

    36 />

    37

    38

    39 30 3

    3

    2 38

    41 placeholder="Password"

    42 type="password"

    43 onChange={e => setPassword(e.target.value)}

    44 value={password}

    45 />

    46 < /FormGroup>

    47

    48

    49

    50 )

    51}

    53экспорт по умолчанию Регистр

    Теперь в приложении .js , давайте включим компоненты входа и регистрации:

    App.js

     

    1import { Card, Tab, Tabs } from "@blueprintjs/core"

    2import { useState } from "react"

    3import Login from "./Login"

    4import Register from "./ Регистрация"

    5

    6function App() {

    7 const [currentTab, setCurrentTab] = useState («логин»)

    8

    9 return (

    10

    11 <Вкладки onChange={setCurrentTab} selectedTabId={currentTab}>

    12 } />

    13 } />

    14

    15

    16

    17 )

    18}

    19

    20экспорт приложения по умолчанию

    Здесь мы используем компонент Tabs из BlueprintJS вместе с локальное состояние реакции, чтобы определить текущую активную вкладку.

    Если вы откроете http://localhost:3000/ в своем браузере, вы сможете переключаться между формами входа и регистрации:

    Создание пользовательского контекста

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

    Создайте папку с именем context и файл с именем UserContext.js внутри нее:

    UserContext.js

     

    1импортировать React, {useState} из "реагировать"

    2

    3const UserContext = React.createContext([{}, () => {}])

    4

    5let InitialState = {}

    6

    7const UserProvider = props => {

    8 const [состояние, setState] = useState (initialState)

    9

    10 возврат (

    11

    12 {props.children}

    13

    14 )

    15}

    16

    17экспорт {UserContext, UserProvider}

    Добавьте поставщика в index.js :

    index.js

     

    1импортировать React из "реагировать"

    2импортировать ReactDOM из "реагировать-дом"

    3импортировать "./index.css"

    4импортировать приложение из "./App"

    50002Userimport} "./контекст/Контекст пользователя"

    6

    70003

    7REACTDOD.RUNDER (

    8

    9

    10

    11

    11

    12 ,

    13 document.getelementbyId ("корень")

    14)

    Отправка форм входа и регистрации:

    Теперь давайте привяжем обработчик отправки к нашей форме входа:

    Login.js

     

    1импортировать {Button, Callout, FormGroup, InputGroup} из "@blueprintjs/core"

    2импортировать React, {useContext, useState} из "реагировать"

    3импортировать {UserContext} из "./контекст/Контекст пользователя"

    4

    5const Login = () => {

    6 const [isSubmitting, setIsSubmitting] = useState(false)

    7 const [ошибка, setError] = useState("")

    8 const [email, setEmail] = useState ("")

    9 const [пароль, setPassword] = useState ("")

    10 const [userContext, setUserContext] = useContext(UserContext)

    11

    12 const formSubmitHandler = e => {

    13 e.preventDefault()

    14 setIsSubmitting(true)

    15 setError("")

    16

    17 const genericErrorMessage = "Что-то пошло не так! Повторите попытку позже."

    18

    19 fetch(process.env.REACT_APP_API_ENDPOINT + "users/login", {

    20 метод: "POST",

    21 учетные данные: "include",

    22 заголовки: { "Content-Type": "application /json" },

    23 тело: JSON.stringify({имя пользователя: электронная почта, пароль}),

    24 })

    25 .then(асинхронный ответ => {

    26 setIsSubmitting(false)

    27 if (!response.ok) {

    28 если (ответ.status === 400) {

    29 setError("Пожалуйста, заполните все поля правильно!")

    30 } else if (response.status === 401) {

    31 setError("Неверная комбинация адреса электронной почты и пароля. ")

    32 } else {

    33 setError(genericErrorMessage)

    34 }

    35 } else {

    36 const data = await response.json()

    37 setUserContext(old { ...oldvalues, токен: data.token}

    39})

    40}

    40}

    41})

    41})

    42 .Catch (ошибка => {

    43 setissubmittion (false)

    44 seteleror (genericerrormessage)

    45 })

    46 }

    47 return (

    48 <>

    49 {ошибка && {ошибка}}

    50

    51

    52

    53

    54 placeholder="Email"

    55 type="email"

    3 90 value={email}

    57 onChange={e => setEmail(e.target.value)}

    58 />

    59

    60

    61

    62

    63placeholder="03assword"0P

    64 type="password"

    65 value={пароль}

    66 onChange={e => setPassword(e.target.value)}

    67 />

    68

    69 <

    70 намерение = "основной"

    71 disabled={isSubmitting}

    72 text={`${isSubmitting ? «Вход» : «Войти»}`}

    73 заполнить

    74 type="submit"

    75 />

    76

    77

    70 3 ) 900}

    80

    81экспорт по умолчанию Логин

    В приведенном выше коде

    • Мы добавили два дополнительных локальных состояния.
    • Во-первых, isSubmitting используется для отключения кнопки входа, когда пользователь уже нажал ее. Он также используется для отображения текста «Вход в систему», чтобы информировать пользователя о том, что происходит.
    • У нас есть состояние ошибки, которое используется для отображения пользователю соответствующего сообщения об ошибке в случае сбоя входа в систему.
    • В formSubmitHandler мы отключаем отправку формы по умолчанию, используя e.preventDefault() .
    • Мы делаем POST-вызов конечной точке /users/login , созданной ранее в серверном проекте с параметры имени пользователя и пароля в теле запроса.
    • В случае каких-либо ошибок мы устанавливаем соответствующее сообщение об ошибке, используя функцию setError .
    • При успешном входе в систему значение токена будет сохранено в контексте пользователя.

    Мы не выполняем проверку имени пользователя и пароля на стороне клиента, учитывая объем сообщения. Я написал статью о том, как выполнить проверку формы в реакции.

    Не забудьте добавить переменную среды REACT_APP_API_ENDPOINT в .env и перезапустите клиентский проект. Он будет иметь URL-адрес сервера в качестве значения:

    .

    .env

     

    1REACT_APP_API_ENDPOINT = http://localhost:8081/

    Если у вас несколько сред, таких как dev, qa, stage, prod и т. д., и хотите увидеть, как вы можете установить несколько переменных среды, вы можете прочитать эту статью.

    Теперь, если вы нажмете на вход с действительными учетными данными и зарегистрируете userContext в Login.js на консоли, вы сможете увидеть токен:

    Аналогичным образом добавьте обработчик отправки в регистрационную форму:

    Регистр.js

     

    1import {Button, Callout, FormGroup, InputGroup} из "@blueprintjs/core"

    2import React, {useContext, useState} из "react"

    3import {UserContext} из "./context/UserContext"

    4

    5const Register = () => {

    6 const [isSubmitting, setIsSubmitting] = useState(false)

    7 const [ошибка, setError] = useState("")

    8 const [firstName, setFirstName] = useState ("")

    9 const [lastName, setLastName] = useState ("")

    10 const [email, setEmail] = useState ("")

    11 const [пароль, setPassword] = useState ("")

    12 const [userContext, setUserContext] = useContext(UserContext)

    13

    14 const formSubmitHandler = e => {

    15 e.preventDefault()

    16 setIsSubmitting(true)

    17 setError("")

    18

    19 const genericErrorMessage = "Что-то пошло не так! Повторите попытку позже."

    20

    21 fetch(process.env.REACT_APP_API_ENDPOINT + "users/signup", {

    22 метод: "POST",

    23 учетные данные: "include",

    24 заголовки: { "Content-Type": "application /json" },

    25 body: JSON.stringify({ firstName, lastName, username: email, password }),

    26 })

    27 .then(async response => {

    28 setIsSubmitting(false)

    29 if (!response.ok) {

    30 if (response.status === 400) {

    31 setError("Пожалуйста, заполните все поля правильно!")

    32 } else if (response.status === 401) {

    33 setError("Неверная комбинация адреса электронной почты и пароля.")

    34 } else if (response.status === 500) {

    35 console.log(ответ)

    36 константные данные = ожидание ответа.json()

    37 if (data.message) setError(data.message || genericErrorMessage)

    38 } else {

    39 setError(genericErrorMessage)

    40 }

    41 } data = {

    3 90 const await response.json()

    43 setUserContext(oldValues ​​=> {

    44 return { ...oldValues, token: data.token }

    45 })

    46 }

    47 })

    4 900.0.catch (ошибка => {

    49 setIsSubmitting (false)

    50 setError (genericErrorMessage)

    51 })

    52 }

    53

    54 возврат (

    55 <>

    56 {ошибка && <Выноска намерение="опасность">{ошибка}}

    57

    58

    59

    60

    61

    62 placeholder="First Имя"

    63 onChange={e => setFirstName(e.target.value)}

    64 value={firstName}

    65 />

    66

    67

    68

    70 placeholder="Фамилия"

    71 onChange={e => setLastName(e.target.value)}

    72 value={lastName}

    73 />

    74

    3

    3

    76

    77

    78 type="email"

    79 placeholder="Email"

    80 onChange={e => setEmail(e.target.value)}

    81 value={email}

    82 />

    83

    84

    80 60 3InputGroup

    2

    3

    0

    87 placeholder="Password"

    88 type="password"

    89 onChange={e => setPassword(e.target.value)}

    90 value={password}

    91 />

    92 /FormGroup>

    93 <Кнопка

    94 намерение = "основной"

    95 disabled={isSubmitting}

    96 text={`${isSubmitting ? "Регистрация": "Зарегистрироваться"} `}

    97 Fill

    97 Тип =" Отправить "

    9000 99 />

    100

    101

    102)

    103}

    104

    105экспорт по умолчанию Регистр

    Отображение экрана приветствия

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

    Сначала создадим компонент приветствия:

    Welcome.js

     

    1импорт React из «реакции»

    2

    3const Добро пожаловать = () => {

    4 return

    Добро пожаловать!

    5}

    6

    7экспорт по умолчанию Добро пожаловать

    В App.js давайте проверим, имеет ли userContext.token какое-либо значение, если да, то мы покажем экран приветствия, иначе мы покажем экран входа/регистрации:

    Приложение.js

     

    1импорт {карты, вкладки, вкладки} из "@blueprintjs/core"

    2импорт {useContext, useState} из "реагировать"

    3импортировать {UserContext} из "./context/UserContext"

    4импорт Войти из "./Login"

    5import Register from "./Register"

    6import Welcome from "./Welcome"

    7

    8function App() {

    9 const [currentTab, setCurrentTab] = useState("логин")

    10 const [userContext, setUserContext] = useContext(UserContext)

    11

    12 вернуть !userContext.жетон? (

    13

    14 <Вкладки onChange={setCurrentTab} selectedTabId={currentTab}>

    15 } />

    16 } />

    17

    18

    19

    20 ) : (

    21 <Добро пожаловать />

    22 )

    23}

    24

    25экспорт приложения по умолчанию

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

    .

    App.js

     

    1import { Card, Tab, Tabs } from "@blueprintjs/core"

    2import { useCallback, useContext, useEffect, useState } from "react"

    3import { UserContext } from "./context/ UserContext"

    4import Loader from "./Loader"

    5import Login from "./Login"

    6import Register from "./Register"

    7import Welcome from "./Добро пожаловать"

    8

    9function App() {

    10 const [currentTab, setCurrentTab] = useState("логин")

    11 const [userContext, setUserContext] = useContext(UserContext)

    12

    13 const verifyUser = useCallback(() => {

    14 fetch(process.env.REACT_APP_API_ENDPOINT + "users/refreshToken", {

    15 метод: "POST",

    16 учетные данные: "include",

    17 заголовков: { "Content-Type": "application/json" },

    18 }).then(async response => {

    19 if (response.ok) {

    20 const data = await response.json()

    21 setUserContext(oldValues ​​=> {

    22 return { ...oldValues, token: data.token }

    23 })

    24 } else {

    25 setUserContext(oldValues ​​=> {

    26 return { ...oldValues, token: null }

    27 }) 2 9 0 9 0 9 0 0 0 3 2 8 0 0 0 2

    30 setTimeout(verifyUser, 5 * 60 * 1000)

    31 })

    32 }, [setUserContext])

    33

    34 useEffect(() => {

    35 verifyUser()

    36 }, [verifyUser])

    37

    38 вернуть пользовательский контекст.токен === ноль? (

    39

    40 <Вкладки onChange={setCurrentTab} selectedTabId={currentTab}>

    41 } />

    42 } />

    43

    44

    45

    46 ) : userContext.token ? (

    47 <Добро пожаловать />

    48 ) : (

    49 <Загрузчик />

    50 )

    51}

    52

    53экспорт приложения по умолчанию

    Здесь мы объявили функцию с именем verifyUser (заключена в useCallback , чтобы избежать повторного объявления при повторном рендеринге компонента), который будет вызываться при загрузке страницы (с помощью useEffect ) и будет вызывать конечную точку /refreshToken .Если он получает успешный ответ, он сохраняет токен из тела ответа в контекст. Если мы получаем какую-либо ошибку при вызове токена обновления, мы устанавливаем токен на null в контексте. Это означает, что всякий раз, когда пользователь не аутентифицирован, для токена будет установлено значение null , и мы покажем экран входа в систему.

    При вызове токена обновления мы отобразим счетчик, включив компонент Loader . Вот код загрузчика .js :

    Loader.js

     

    1импортировать { Spinner } из "@blueprintjs/core"

    2импортировать React из "реагировать"

    3

    4const Loader = () => {

    5 return (

    6

    7

    8

    90 ) )

    10}

    11

    12экспорт загрузчика по умолчанию

    Давайте также убедимся, что счетчик находится в центре, добавив несколько стилей:

    индекс

    .css

     

    1

    2.loader {

    3 поле: 100 пикселей авто;

    4}

    Вы увидите, что в App.js мы вызываем функцию verifyUser каждые 5 минут. Это автоматическое обновление в действии, используемое для обновления токена аутентификации, срок действия которого составляет 15 минут.

    Получение сведений о пользователе

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

    Добро пожаловать.js

     

    1import {Button, Card} из "@blueprintjs/core"

    2import React, {useCallback, useContext, useEffect} из "react"

    3import {UserContext} из "./context/UserContext"

    4import Загрузчик из "./Loader"

    5

    6const Добро пожаловать = () => {

    7 const [userContext, setUserContext] = useContext(UserContext)

    8

    9 const fetchUserDetails = useCallback(() => {

    10 fetch(process.env.REACT_APP_API_ENDPOINT + "users/me", {

    11 метод: "GET",

    12 учетные данные: "include",

    13

    14 заголовки: {

    15 "Content-Type": "application/ json",

    16 Авторизация: `Bearer ${userContext.token}`,

    17 },

    18 }).then(async response => {

    19 if (response.ok) {

    20 const data = await response.json()

    21 setUserContext(oldValues ​​=> {

    22 return { ...oldValues, детали: данные }

    23 })

    24 } else {

    25 if (response.status === 401) {

    26

    27

    9.reload window 2 9.9000 28 ()

    30} else {

    31 SetuSercontext (OldValues ​​=> {

    32 Return {... OldValues, детали: NULL}

    33})

    34}

    35}

    36})

    37 }, [setUserContext, userContext.жетон])

    38

    39 Use Expectect (() => {

    40

    41 if (! Usercontext.details) {

    42 fetchuserdetails ()

    43}

    44}, [USERCONTEXT.Details, FetchuserDetails])

    45

    46 Const RefitchHandler = () => {

    47

    48

    48

    49 SetuSercontext (OldValues ​​=> {

    50 Repeate {... OldValues, детали: undefined}

    51})

    52}

    53

    54 вернуть пользовательский контекст.подробности === ноль? (

    55 «Ошибка при загрузке сведений о пользователе»

    56 ) : !userContext.details ? (

    57 <Загрузчик />

    58 ) : (

    59 <Подъем карты="1">

    60

    61

    62002 62

    63 Добро пожаловать

    64

    65 {userContext.details.firstName}

    66 {userContext.details.lastName &&

    67 " " + userContext.details.lastName}

    68 !

    69

    70

    71 Ваши призовые баллы: {userContext.details.points}

    72

    73

    74

    75

    77

    78

    79 )

    80}

    81

    82экспорт по умолчанию Добро пожаловать

    Здесь у нас есть fetchUserDetails , который будет вызываться из хука useEffect всякий раз, когда userContext.детали не имеют никакого значения. В функции fetchUserDetails мы вызываем конечную точку /users/me , передавая токен аутентификации в заголовке. Ответ на вызов будет сохранен в userContext.details . Если при получении ответа возникает какая-либо ошибка, мы устанавливаем userContext.details на null , чтобы мы могли показать пользователю сообщение об ошибке.

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

    Функция выхода из системы

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

    Welcome.js

     

    1импортировать {Button, Card} из "@blueprintjs/core"

    2импортировать React, {useCallback, useContext, useEffect} из "реагировать"

    3импортировать {UserContext} из "./context/UserContext"

    4импорт загрузчика из "./Loader"

    5

    6const Добро пожаловать = () => {

    7 const [userContext, setUserContext] = useContext(UserContext)

    8

    9 const fetchUserDetails = useCallback(() => {

    10 fetch(process.env.REACT_APP_API_ENDPOINT + "users/me", {

    11 метод: "GET",

    12 учетные данные: "include",

    13

    14 заголовков: {

    15 "Content-Type": "application/json",

    16 Авторизация: `Bearer ${userContext.token}`,

    17 },

    18 }).then(async response => {

    19 if (response.ok) {

    20 const data = await response.json()

    21 setUserContext(oldValues => {

    22 return { ...oldValues, детали: данные }

    23 })

    24 } else {

    25 if (response.status === 401) {

    2 2

    0 2 7 28

    29 окно.location.reload()

    30 } else {

    31 setUserContext(oldValues ​​=> {

    32 return { ...oldValues, детали: null }

    33 })

    34 } 2 3003

    305 })

    37 }, [setUserContext, userContext.token])

    38

    39 useEffect(() => {

    40

    41 if (!userContext.details) {

    42 fetchUserDetails()

    43 }

    44.}, [userContext.}подробности, fetchUserDetails])

    45

    46 const logoutHandler = () => {

    47 fetch(process.env.REACT_APP_API_ENDPOINT + "users/logout", {

    48 учетные данные: "include",

    49 заголовки: {

    5 Тип": "application/json",

    51 Авторизация: `Bearer ${userContext.token}`,

    52 },

    53 }).then(async response => {

    54 setUserContext(oldValues ​​=> {

    55 возврат { ...oldValues, детали: не определено, токен: null }

    56 })

    57

    61 const Refitchhandler = () => {

    62

    63

    64 SetuSercontext (OldValues ​​=> {

    65 Return {... OldValues, детали: undefined}

    66})

    67}

    68

    69 вернуть пользовательский контекст.подробности === ноль? (

    70 "Ошибка при загрузке сведений о пользователе"

    71) : !userContext.details ? (

    72 <Загрузчик />

    73 ) : (

    74 <Подъем карты="1">

    75

    76

    77

    78 Добро пожаловать

    79

    80 {userContext.details.firstName}

    81 {userContext.details.lastName &&

    82 " " + userContext.details.lastName}

    83 !

    84

    85

    86 Ваши призовые баллы: {userContext.details.points}

    87

    88

    89

    90

    98

    99

    100 )

    101002}

    102

    103экспорт по умолчанию Добро пожаловать

    При нажатии кнопки выхода из системы мы вызываем функцию logoutHandler logoutHandler мы вызываем конечную точку /users/logout , чтобы токен обновления был удален из базы данных и файла cookie. Наконец, мы устанавливаем данные пользователя и токен в контексте на null , чтобы отображалась страница входа.

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

    Давайте также добавим стиль к экрану приветствия:

    индекс

    .css

     

    1

    2.user-details {

    3 display: flex;

    4 выравнивание-содержание: пробел-между;

    5}

    6.user-actions {

    7 display: flex;

    8 flex-direction: столбец;

    9}

    Теперь экран приветствия должен выглядеть так:

    Выход из нескольких вкладок

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

     

    1import { Card, Tab, Tabs } из "@blueprintjs/core"

    2import { useCallback, useContext, useEffect, useState } из "react"

    3import {UserContext} из "./context/UserContext"

    4import Загрузчик из "./Loader"

    5import Вход из "./Login"

    6import Регистрация из "./Register"

    7import Welcome из "./Welcome"

    8

    9function App() {

    10 const [currentTab, setCurrentTab] = useState("логин")

    11 const [userContext, setUserContext] = useContext(UserContext)

    12

    13 const verifyUser = useCallback(() => {

    14 fetch(process.env.REACT_APP_API_ENDPOINT + "users/refreshToken", {

    15 метод: "POST",

    16 учетные данные: "include",

    17 заголовков: { "Content-Type": "application/json" },

    18 }).then(async response => {

    19 if (response.ok) {

    20 const data = await response.json()

    21 setUserContext(oldValues ​​=> {

    22 return { ... oldValues, token: data.token }

    23 })

    24 } else {

    25 setUserContext(oldValues ​​=> {

    26 return { ...oldvalues, токен: NULL}

    27})

    27})

    28}

    29

    30 Settimeate (VerifyUser, 5 * 60 * 1000)

    31})

    31}, [SetuSercontext])

    33

    34 useEffect(() => {

    35 verifyUser()

    36 }, [verifyUser])

    37

    38

    39

    40

    41 const syncLogout = useCallback(event => {

    42 if (event.key === "logout") {

    43

    window.location.reload()

    45 }

    46 }, [])

    47

    48 useEffect(() => {

    49 window.addEventListener("storage", syncLogout)

    50 return () => {

    51 window.removeEventListener("storage", syncLogout)

    503 9000}

    53 }, [syncLogout])

    54

    55 вернуть userContext.token === null ? (

    56

    57 <Вкладки onChange={setCurrentTab} selectedTabId={currentTab}>

    58 } />

    59 } />

    60 <Вкладки.Expander />

    61

    62

    63 ) : userContext.token ? (

    64 <Добро пожаловать />

    65 ) : (

    66 <Загрузчик />

    67 )

    68}

    69

    70экспорт приложения по умолчанию

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

    Исходный код и демонстрация

    Вы можете просмотреть полный исходный код клиента здесь, сервер здесь, а демо здесь.

    Если вам понравилась статья, оставайтесь со мной на связи, подписавшись на меня в Twitter.

    Обновление безопасности для библиотеки Passport-Azure-AD для Node.js

    Сводка

    Уязвимость, связанная с повышением привилегий, возникает, когда библиотека паспортов Azure Active Directory (Passport-Azure-AD для Node.js) неправильно проверяет токены идентификаторов.

    Злоумышленник, который успешно воспользуется этой уязвимостью, может обойти проверку подлинности Azure Active Directory для целевого хост-веб-приложения. Чтобы воспользоваться этой уязвимостью, злоумышленник должен отправить целевому веб-приложению специально созданный токен, содержащий допустимые утверждения идентификации пользователя. Это обновление устраняет уязвимость, исправляя способ проверки токенов идентификатора, когда стратегии Passport используют преимущества Azure Active Directory.

    Часто задаваемые вопросы об этой уязвимости

    Вопрос 1. Я использую Azure Active Directory.Я затронут?

    A1. Эта уязвимость затрагивает только веб-приложения, которые используют библиотеку Passport-Azure-AD для Node.js, чтобы использовать преимущества Azure AD для проверки подлинности. Стандартная проверка подлинности Azure AD, которая не использует библиотеку Passport-Azure-AD для Node.js, не затрагивается. Уязвимость существует в веб-приложениях, использующих устаревшие версии библиотеки Passport-Azure-AD для Node.js.

    Вопрос 2. Что такое Passport-Azure-AD для Node.js?

    A2: Passport-Azure-AD для Node.js — это набор стратегий Passport, которые помогут вам интегрировать ваши узловые приложения с Azure Active Directory. Он включает аутентификацию и авторизацию OpenID Connect, WS-Federation и SAML-P. Эти поставщики позволяют использовать многие функции Passport-Azure-AD для Node.js, включая единый веб-вход (WebSSO), Endpoint Protection с OAuth, а также выдачу и проверку токена JWT.

    Обновить информацию

    Разработчики, использующие Passport Azure AD Node.js необходимо загрузить последнюю версию библиотеки Passport-Azure-AD для Node.js, а затем обновить свои приложения. Технические детали опубликованы в нашем репозитории GitHub.

    Разработчики, использующие версию 1. x , должны обновиться до версии 1.4.6.

    Разработчики, использующие версию 2.0, должны выполнить обновление до версии 2.0.1.

    Статус

    Корпорация Майкрософт подтвердила, что это проблема в Passport-Azure-AD для Node.js-библиотека.

    Каталожные номера

    Номер CVE: 2016-7191

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

    Обработка аутентификации в NodeJS (Express) с помощью Passport. Часть 1 — Настройка проекта | by Sijuade Ajagunna

    Это серия статей, которые помогут вам настроить аутентификацию и авторизацию в приложениях NodeJS на стороне сервера с помощью PassportJS.Мы начнем с локальной стратегии (общий метод аутентификации по имени пользователя и паролю), а затем перейдем к другим стратегиям (таким как регистрация и вход через Twitter и другие популярные сервисы).

    Что мы рассмотрим в этой серии:

    • Настройка приложения Express для использования импорта ES6
    • Настройка и подключение базы данных MongoDB к вашему приложению
    • Создание схем Mongoose
    • Passport Local Strategy
    • и Обработка веб-токенов JSON (JWT)
    • Passport Стратегии Google и Twitter
    • Обработка файлов cookie и защищенных маршрутов
    • Обработка ошибок

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

    В этом проекте мы настроим наш проект для использования импорта JavaScript ES6 и добавим промежуточное ПО для обработки ошибок.

    Что такое паспорт?

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

    Passport обрабатывает аутентификацию двумя способами: сеансами и сеансами на стороне сервера. В этой статье мы будем использовать JWT. Чтобы узнать больше о разнице между этими двумя, вы можете проверить эту ветку переполнения стека.

    Приступим:

    Ваш набор инструментов

    На вашем компьютере должен быть установлен NodeJS. Вы можете следовать этому руководству, чтобы настроить его. У вас также должен быть установлен MongoDB (или вместо этого вы можете создать учетную запись Mongoose Atlas).

    Настройка папки

    Создайте папку проекта, cd в нее и инициализируйте новый пакет с помощью npm init -y . Ваша папка должна содержать файл package.json. Создайте папку src и следуйте приведенной ниже структуре папок.

     ├──SRC 
     ├──SRC 
    ├───DB
    ├───Controllers
    ├───HELPERS
    ├───middleware
    ├────ODELS
    └───ROUTES
    ├───mODELS
    └ ───services
    index.js
    app.js

    Вы, наверное, согласитесь со мной, что import и export выглядят лучше, чем требуют модулей и .exports , поэтому давайте настроим Babel, чтобы наше приложение могло использовать синтаксис импорта ES6.

    В терминале (убедитесь, что на этот раз вы находитесь в корневой папке, а не в папке src) выполните следующие команды:

     npm i @babel/register @babel/runtimenpm i -D @babel/cli @ babel/core @babel/node @babel/preset-env 

    Еще в корневой папке создайте файл .babelrc и вставьте в него следующий код

     { 
    "presets": [
    [
    "@babel /preset-env",
    {
    "useBuiltIns": "usage",
    "corejs": 3
    }
    ]
    ]
    }

    После правильной настройки babel пришло время поработать в папке src .

    Во-первых, нам нужно установить еще несколько зависимостей:

     npm i express cookie-parser cross-env debug dotenv morgan nodemon 

    И затем немного обработки ошибок

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

    Catch Async Errors

    Создайте новый файл в папке промежуточного ПО с именем catchAsync.js и скопируйте в него следующий код.

    В той же папке промежуточного ПО создайте файл errorHandler.js и добавьте следующий код:

    И, наконец, для наших классов ошибок создайте файл errors.js в папке помощников. Это должно выглядеть так:

    На данный момент у нас есть только два класса ошибок, но при необходимости мы можем увеличить их.

    Затем скопируйте следующий код в файл app.js.

    Наконец, в наш файл index.js мы импортируем наше приложение.js и создайте HTTP-сервер.

    Теперь создайте файл .env в корневой папке и настройте переменные среды.

     PORT=5000 
    NODE_ENV=development

    Дальше идут сценарии! Нет, не несколько версий группы, а ваши сценарии package.json для запуска вашего приложения. Мы создадим сценарии dev , start , build , clean и build-babel , чтобы мы могли запускать наше приложение в среде разработки или в рабочей среде.

    В файле package.json добавьте в свойство scripts следующие команды:

     "build": "npm run clean && npm run build-babel", 
    "build-babel": "babel -d ./build ./src -s",
    "clean": "rm -rf .nyc_output покрытие сборки && mkdir build",
    "dev": "cross-env DEBUG=dev nodemon --exec babel-node src/index.js" ,
    "start": "node ./build/index.js",
    • Сценарий dev запускает ваше приложение в режиме разработки, который мы и будем использовать.
    • Сценарий сборки компилирует ваше приложение в папку сборки, преобразуя код ES6+ в обратно совместимую версию JavaScript в текущей и более старых средах.
    • Стартовый сценарий запускает скомпилированное приложение NodeJS.

    Во второй статье мы интегрируем базу данных MongoDB и настроим PassportJS в нашем приложении.

    Этот проект доступен на GitHub , вы также можете подписаться на меня в Twitter .

    Создайте систему входа в Node.js. Как использовать Passport.js для пользователя… | by Hussain Arif

    Пользовательская схема и модель

    Как обычно, перед созданием документов и их сохранением в базе данных необходимо определить схему. Сначала создайте каталог models и создайте там файл с именем user.js таким образом, чтобы он был models/user.js . Во-первых, давайте создадим схему в user.js . Далее мы создадим модель из этой схемы.

    В models/user.js :

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

    В строке 20 мы используем эту схему в вашей модели User . Все ваши пользователи будут иметь данные в этом формате.

    Обработка POST-запроса к каталогу реестра: проверки

    На этом шаге вы создадите документ в базе данных MongoDB с данными, предоставленными клиентом.

    В начале файла route/users.js импортируйте библиотеку Mongoose и импортируйте только что созданную модель User .

     const User = require("../models/user.js") 

    Теперь в файле route/users.js найдите следующий фрагмент кода:

    Обработка POST-запроса реестра

    Внутри этого дескриптора , напишите следующий код:

    • Строка 1 : извлечение значений из элементов формы. Вы вынимаете почту, имя пользователя, его пароль. Последнее поле ( password2 ) является проверкой, чтобы убедиться, что пользователь подтвердил правильность вводимого им пароля.
    • Строки 4-6 : Если какое-либо из полей не заполнено, добавьте соответствующее сообщение в массив error .
    • Строки 8–10 : Если пароли не совпадают, добавьте соответствующее сообщение в массив error .
    • Строки 13–15 : Проверьте, содержит ли пароль не менее шести символов.
    • Строки 16–23 : Если присутствует какое-либо содержимое в массиве error , повторно визуализируйте регистр .ejs , а затем отправьте соответствующие данные вместе с массивом ошибок . Все содержимое этого массива будет отображаться на странице.
    • Строки 24–36 : Вы успешно прошли проверку! Теперь вы сначала узнаете, есть ли уже пользователь в базе данных по электронной почте. Если есть, то вы повторно отобразите страницу register.ejs и отобразите соответствующую ошибку. В противном случае создайте нового пользователя с указанным адресом электронной почты, именем и соответствующим паролем.Имейте в виду, что вы еще не сохранили его. Вы сохраните его после шифрования пароля.

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

    Вывод кода после намеренного ввода неправильных параметров

    Теперь вам нужно отобразить ошибки, т.е. , отобразите содержимое массива ошибок .

    Отображение ошибок

    Теперь перейдите к views/register.ejs и найдите следующий фрагмент кода (это будет примерно в начале файла):

    Код для поиска в views/register.ejs

    Когда вы его найдете, напишите следующую строку прямо под этим тегом h2 :

     <%- include ('./partials/messages') %> 

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

    Перейдите в каталог views , создайте новый каталог с именем partials и внутри partials создайте файл с именем messages.ejs . Там напишите следующий код.

    просмотров/частей/сообщений.ejs

     <% if(typeof errors!= 'undefined') { %> 
    <% errors.forEach(function(error){ %>

    <%= error.msg %>


    <% }) %>
    <% } %>

    Этот код говорит, что если есть какие-либо ошибки, то отображать содержимое массива с его собственным элементом абзаца ( p ).

    Повторно запустите код и напишите односимвольный пароль. Это будет вывод:

    Обратите внимание, что вы теперь отобразили сообщение об ошибке

    Если вы оставите какое-либо из полей пустым, вы получите следующее сообщение об ошибке:

    В этой форме отображаются два сообщения об ошибке

    Заставьте оба поля пароля содержать разные значения :

    В этой форме отображаются три сообщения об ошибках

    Обработка POST-запросов к реестру: сохранение пользователей в базе данных

    На этом шаге вы сохраните зарегистрированных пользователей в базе данных MongoDB.Сначала вы зашифруете их пароли, а затем сохраните их в базе данных.

    В route/users.js найдите следующий фрагмент кода:

    Код в route/users.js

    В этом блоке else напишите следующий фрагмент кода:

    И на этой ноте завершите еще утверждение здесь.

    • Строки 2–7 : Генерация соли, хэш пароля пользователя. Назначьте это зашифрованное значение паролю пользователя, а затем сохраните клиента в базе данных.
    • Строка 10 : Когда документ будет сохранен без ошибок, перенаправьте пользователя в каталог login , где пользователь теперь войдет в систему со своими учетными данными.

    Это будет вывод кода, когда вы зарегистрируетесь в качестве пользователя:

    Вывод кода

    Поскольку вы вышли из системы из содержимого документа в своей консоли, вот вывод в консоли:

    Содержание документа newUser

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

    Вывод кода, показывающий, что у вас есть ошибка

    На этом шаге вы, наконец, сохранили пользователей в базе данных.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *