ЈСОН веб токени су једноставни за коришћење и отклањање грешака, али такође нуде импресивно повећање безбедности.

Прекинута аутентикација је и даље стална рањивост у модерним веб апликацијама—и даље је високо рангирана у ОВАСП-ових 10 највећих безбедносних ризика за АПИ.

Последице ове рањивости могу бити озбиљне. Они могу одобрити неовлашћени приступ осетљивим подацима и угрозити интегритет система. Да бисте ефикасно обезбедили сигуран приступ апликацијама и њиховим ресурсима, од виталног је значаја да користите робусне механизме аутентификације.

Сазнајте како можете да примените аутентификацију корисника у Фласк користећи ЈСОН веб токене (ЈВТ), популаран и ефикасан метод заснован на токенима.

Аутентификација заснована на токенима помоћу ЈСОН веб токена

Потврда идентитета заснована на токенима користи шифровани низ знакова за валидацију и ауторизацију приступа систему или ресурсу. Ову врсту аутентификације можете применити користећи различите методе, укључујући токене сесије, АПИ кључеве и ЈСОН веб токене.

ЈВТ-ови, посебно, нуде сигуран и компактан приступ за пренос потребних корисничких акредитива између апликација на страни клијента и сервера.

ЈВТ се састоји од три главне компоненте: заглавља, корисног оптерећења и потписа. Заглавље садржи метаподатке о токену, укључујући алгоритам хеширања који се користи за кодирање токена.

Корисни терет садржи стварне корисничке акредитиве, као што су кориснички ИД и дозволе. На крају, потпис обезбеђује валидност токена тако што проверава његов садржај помоћу тајног кључа.

Користећи ЈВТ-ове, можете аутентификовати кориснике и чувати податке о сесији унутар самог токена.

Подесите Фласк пројекат и МонгоДБ базу података

Да бисте започели, креирајте нови директоријум пројекта користећи терминал:

мкдир фласк-пројекат
цд фласк-пројекат

Следеће, инсталирајте виртуаленв, да креирате локално виртуелно развојно окружење за ваш Фласк пројекат.

виртуаленв венв

На крају, активирајте виртуелно окружење.

# Уник или МацОС: 
извор венв/бин/активирај

# Виндовс:
.\венв\Сцриптс\ацтивате

Овде можете пронаћи код овог пројекта ГитХуб спремиште.

Инсталирајте потребне пакете

У основном директоријуму фасцикле вашег пројекта креирајте нову Захтеви.ткт датотеку и додајте ове зависности за пројекат:

пљоска
пијвт
питхон-дотенв
пимонго
бцрипт

На крају, покрените наредбу испод да бисте инсталирали пакете. Уверите се да имате пип (менаџер пакета) инсталиран; ако не, инсталирајте га на свој Виндовс, Мац или Линук систем.

пип инсталл -р Захтеви.ткт

Направите МонгоДБ базу података

Само напред и креирајте МонгоДБ базу података. Можете поставити локалну МонгоДБ базу података, алтернативно, креирајте кластер на МонгоДБ Атлас, МонгоДБ сервису заснованом на облаку.

Када креирате базу података, копирајте УРИ везе, креирајте а .енв датотеку у основном директоријуму вашег пројекта и додајте је на следећи начин:

МОНГО_УРИ=""

Коначно, конфигуришите везу са базом података из ваше апликације Фласк. Створити нова утилс/дб.пи датотеку у основном директоријуму вашег пројекта, са овим кодом:

из пимонго увоз МонгоЦлиент

дефцоннецт_то_монгодб(монго_ури):
клијент = МонгоЦлиент (монго_ури)
дб = цлиент.гет_датабасе("корисници")
повратак дб

Ова функција успоставља везу са МонгоДБ базом података користећи дати УРИ везе. Затим ствара нову корисника збирка ако не постоји и враћа одговарајућу инстанцу базе података.

Креирајте Фласк веб сервер

Са конфигурисаном базом података, наставите и креирајте апп.пи датотеку у основном директоријуму фасцикле пројекта и додајте следећи код да бисте креирали инстанцу апликације Фласк.

из пљоска увоз Фласк
из роутес.усер_аутх увоз регистер_роутес
из утилс.дб увоз цоннецт_то_монгодб
увоз ос
из дотенв увоз лоад_дотенв

апп = Фласк (__наме__)
лоад_дотенв()

монго_ури = ос.гетенв('МОНГО_УРИ')
дб = цоннецт_то_монгодб (монго_ури)

регистер_роутес (апликација, дб)

ако __наме__ == '__главни__':
апп.рун (дебуг=Истина)

Креирајте крајње тачке АПИ-ја за аутентификацију

Да бисте имплементирали аутентификацију корисника у вашу Фласк апликацију, кључно је дефинисати неопходне крајње тачке АПИ-ја које управљају операцијама у вези са аутентификацијом.

Међутим, прво дефинишите модел за податке корисника. Да бисте то урадили, креирајте нову модел/усер_модел.пи датотеку у основном директоријуму и додајте следећи код.

из пимонго.цоллецтион увоз Цоллецтион
из бсон.објецтид увоз ОбјецтИд

класаКорисник:
деф__у томе__(сам, колекција: колекција, корисничко име: стр, лозинка: стр):
селф.цоллецтион = збирка
селф.усернаме = корисничко име
селф.пассворд = лозинка
дефсачувати(сам):
кориснички_подаци = {
'корисничко име': селф.усернаме,
'Лозинка': селф.пассворд
}
резултат = селф.цоллецтион.инсерт_оне (усер_дата)
повратак стр (ресулт.инсертед_ид)

@статицметход
деффинд_би_ид(колекција: колекција, усер_ид: стр):
повратак цоллецтион.финд_оне({'_ид': ОбјецтИд (усер_ид)})

@статицметход
деффинд_би_усернаме(колекција: колекција, корисничко име: стр):
повратак цоллецтион.финд_оне({'корисничко име': корисничко име})

Код изнад наводи а Корисник класа која служи као модел података и дефинише неколико метода за интеракцију са МонгоДБ колекцијом за обављање операција везаних за кориснике.

  1. Тхе сачувати метода чува нови кориснички документ са датим корисничким именом и лозинком у МонгоДБ колекцију и враћа ИД уметнутог документа.
  2. Тхе финд_би_ид и финд_би_усернаме методе преузимају корисничке документе из колекције на основу датог корисничког ИД-а или корисничког имена, респективно.

Дефинишите руте за аутентификацију

  1. Почнимо са дефинисањем пута регистрације. Ова рута ће додати нове корисничке податке у колекцију корисника МонгоДБ. У основном директоријуму креирајте нови роутес/усер_аутх.пи датотеку и следећи код.
    увоз јвт
    из фунцтоолс увоз облози
    из пљоска увоз јсонифи, рекуест, маке_респонсе
    из модели.усер_модел увоз Корисник
    увоз бцрипт
    увоз ос

    дефрегистер_роутес(апликација, дб):
    збирка = дб.усерс
    апп.цонфиг['ТАЈНИ КЉУЧ'] = ос.урандом(24)

    @апп.роуте('/апи/регистер', метходс=['ПОСТ'])
    дефрегистровати():

    корисничко име = рекуест.јсон.гет('корисничко име')
    лозинка = рекуест.јсон.гет('Лозинка')

    постојећи_усер = Усер.финд_би_усернаме (колекција, корисничко име)
    ако постојећи корисник:
    повратак јсонифи({'порука': 'Корисничко име већ постоји!'})

    хассхед_пассворд = бцрипт.хасхпв (пассворд.енцоде('утф-8'), бцрипт.генсалт())
    нев_усер = Корисник (колекција, корисничко име, хассхед_пассворд.децоде('утф-8'))
    усер_ид = нев_усер.саве()

    повратак јсонифи({'порука': 'Корисник је успешно регистрован!', 'ИД корисник': ИД корисник})

  2. Имплементирајте функционалност пријављивања да бисте управљали процесом аутентификације и верификовали корисничке акредитиве. Испод путање регистрације додајте следећи код.
     @апп.роуте('/апи/логин', метходс=['ПОСТ'])
    дефПријавите се():
    корисничко име = рекуест.јсон.гет('корисничко име')
    лозинка = рекуест.јсон.гет('Лозинка')
    корисник = Усер.финд_би_усернаме (колекција, корисничко име)
    ако корисник:
    ако бцрипт.цхецкпв (пассворд.енцоде('утф-8'), корисник['Лозинка'].енцоде('утф-8')):
    токен = јвт.енцоде({'ИД корисник': стр (корисник['_ид'])}, апп.цонфиг['ТАЈНИ КЉУЧ'], алгоритам='ХС256')

    одговор = маке_респонсе (јсонифи({'порука': 'Пријављивање успешно!'}))
    респонсе.сет_цоокие('жетон', жетон)
    повратак одговор

    повратак јсонифи({'порука': 'Погрешно корисничко име или лозинка'})

    Крајња тачка за пријаву ради две ствари: проверава достављене корисничке акредитиве и, након успешне аутентификације, генерише јединствени ЈВТ за тог корисника. Поставља овај токен као колачић у одговору, заједно са ЈСОН корисним учитавањем који указује на успешну пријаву. Ако су акредитиви неважећи, вратиће ЈСОН одговор који то указује.
  3. Дефинишите функцију декоратора која верификује ЈСОН веб токене (ЈВТ) прослеђене заједно са наредним захтевима АПИ-ја. Додајте код испод у оквиру регистер_роутес блок кода функције.
    дефтокен_рекуиред(ф):
    @облози (ф)
    дефукрашена(*аргс, **кваргс):
    токен = рекуест.цоокиес.гет('жетон')

    аконе токен:
    повратак јсонифи({'порука': „Недостаје токен!“}), 401

    покушати:
    подаци = јвт.децоде (токен, апп.цонфиг['ТАЈНИ КЉУЧ'], алгоритми=['ХС256'])
    тренутни_усер = Усер.финд_би_ид (колекција, подаци['ИД корисник'])
    осим јвт. ЕкпиредСигнатуреЕррор:
    повратак јсонифи({'порука': „Токен је истекао!“}), 401
    осим јвт. ИнвалидТокенЕррор:
    повратак јсонифи({'порука': 'Неважећи токен!'}), 401

    повратак ф (тренутни_корисник, *аргс, **кваргс)

    повратак украшена

    Ова функција декоратора обезбеђује присуство важећег ЈВТ токена у наредним АПИ захтевима. Проверава да ли токен недостаје, да ли је истекао или је важећи и враћа одговарајући ЈСОН одговор ако јесте.
  4. На крају, направите заштићену руту.
     @апп.роуте('/апи/усерс', метходс=['ГЕТ'])
    @токен_рекуиред
    дефгет_усерс(тренутни корисник):
    корисници = листа (цоллецтион.финд({}, {'_ид': 0}))
    повратак јсонифи (корисници)

Ова крајња тачка управља логиком за преузимање корисничких података из базе података, али захтева да клијент који шаље захтеве укључи важећи токен за приступ подацима.

Коначно, покрените наредбу испод да бисте покренули развојни сервер.

фласк рун

Да бисте тестирали регистрацију, пријаву и крајњу тачку заштићених корисника, можете користити Постман или било који други АПИ клијент. Пошаљите захтеве на http://localhost: 5000/api/и посматрајте одговоре да бисте проверили функционалност ових крајњих тачака АПИ-ја.

Да ли је аутентификација токеном поуздана безбедносна мера?

ЈСОН веб токени пружају снажан и ефикасан начин аутентификације корисника за вашу веб апликацију. Међутим, важно је разумети да аутентификација токеном није сигурна; то је само један део веће безбедносне слагалице.

Комбинујте аутентификацију токеном са другим најбољим безбедносним праксама. Не заборавите да континуирано надгледате и усвојите доследне безбедносне праксе; значајно ћете побољшати укупну безбедност ваших Фласк апликација.