Как да направите магически връзки с възел

Системата без пароли, въведена от Slack като вълшебна връзка, е много добра алтернатива на основната система за удостоверяване на имейл / парола по много причини. Дори и да не контролирате нивото на защита на криптирането на паролата, считате, че доставчикът на вашата пощенска кутия за потребители е достатъчно безопасен и фактът, че ви връща знак, който току-що сте изпратили, е достатъчно начин да ги удостоверите. По този начин можем да разглеждаме това като евтино удостоверяване на OAuth (като Facebook), което не ни предоставя информация за потребителя.

разлика между oAuth и магическа връзка

Какво ще кажете за внедряването?

С предишната схема знаем, че ще трябва да реализираме само 2 крайни точки. Единият да изпрати заявка за ключ за удостоверяване и един за удостоверяване.

В крайната точка за удостоверяване ще ни трябват 3 неща. Достъпът до нашата база данни за поддържане на акаунта, генериране на маркера и генериране на поща. За да генерираме маркера, ще използваме JSON Web Token подход. Предимството е, че можем да вградим известно съдържание в маркера и да сме сигурни, че то не е променено.

Сега ще генерираме връзка, съдържаща маркера в заявката, и ще я изпратим на потребителя по пощата.

Когато нашият потребител щракне върху тази връзка, трябва да пресечем маркера, който се предава като параметър на заявка, да декодираме съдържанието и да го поставим в контекста на заявката. За целта просто трябва да използваме експресен междинен софтуер, наречен express-jwt.

Сега, когато потребителят кликне върху връзката, ние ще разполагаме с неговата информация в контекста и можем просто да ги използваме.

И тук нашият жизнен цикъл е завършен. Нашите потребители вече могат да се удостоверяват само като използват имейл адреса си.

Ами сигурността?

Първо, трябва да вземем предвид, че пощенската кутия на нашия потребител може да бъде компрометирана. Ако някой друг прихване пощата, съдържаща маркера, той може да има достъп до неговия акаунт за целия ни живот. Има няколко възможности за решаване на това.

Първият би бил да имаме таблица с черен списък за маркера, който искаме да отменим. Доста досадно и против принципа да се правят JWT маркери.

И какво да кажем за поставянето на ревизионен индекс в маркера, който ще съхраняваме в базата данни? По този начин само маркерът с последната ревизия ще бъде в състояние да влезе. С това решение ние също губим принципа на JWT, защото трябва да търсим в базата данни всеки път, когато потребител направи заявка.

Най-хубавото решение би могло да бъде, че токенът, който изпращаме по пощата, има наистина кратък живот, например 1 час, и при първата заявка, която потребителят отправя към сървъра, генерираме нов маркер с по-дълъг живот.

Друго силно решение би било да се раздели маркера на две части. Изпратете първото парче по пощата на потребителя и върнете второто парче обратно на приложението в отговор на заявката. По този начин само този мобилен или браузър ще може да възстанови маркера и да се удостовери.

Един пример би бил хубав!

Изходният код на работещ пример е достъпен на следната връзка.

Интересувате се като подадете заявление?