


Qu'est-ce qu'un système d'authentification unique?? Comment l'implémenter en utilisant nodejs ?
Feb 24, 2023 pm 07:33 PMQu'est-ce qu'un système d'authentification unique?? Comment l'implémenter en utilisant nodejs ? L'article suivant vous présentera comment utiliser Node pour implémenter un système d'authentification unique. J'espère qu'il vous sera utile?!
Single Sign On SSO (Single Sign On) consiste à supprimer la fonction de connexion dans deux ou plusieurs systèmes d'entreprise pour former un nouveau système, de sorte qu'après une connexion, vous puissiez vous connecter à n'importe quel système d'entreprise Non besoin de se connecter.
1. Connaissances de base
1.1 Même politique d'origine
Source = protocole + nom de domaine + port
Prenons http://www.a.com comme exemple :
- https : // www.a.com ?(protocole différent)
- http://www.b.com ?(nom de domaine différent)
- http://www.a.com:3000 ?(port différent)
Politique de même origine Le comportement du navigateur consiste à assurer la sécurité en garantissant que les ressources de l'application ne sont accessibles que par cette application.
1.2 Mécanisme de session
Puisque le protocole http est un protocole sans état (une fois les données client et serveur échangées, la connexion sera fermée et la connexion sera rétablie la prochaine fois), mais nous besoin de mémoriser le mot de passe, etc. fonction, il est évident que la session doit être enregistrée. [Recommandations de didacticiel associées?: Tutoriel vidéo Nodejs]
Le suivi de session couramment utilisé est celui des cookies et des sessions. Une compréhension simple de ceux-ci est qu'il s'agit de structures de données qui peuvent stocker des clés et des valeurs. c?té et les sessions sont stockées c?té serveur.
2. Authentification unique
1. Même domaine parent SSO
Même domaine parent, tel que www.app1.aaa.com
, www. app2. aaa.com
Les deux serveurs se trouvent dans le domaine parent de .aaa.com. www.app1.aaa.com
,www.app2.aaa.com
這兩個(gè)服務(wù)器都是在.aaa.com的父域名。
默認(rèn)情況下,兩個(gè)服務(wù)器下頁面之間的cookie是互相訪問不到的。
但是我們可以通過設(shè)置cookie的domain屬性為共通的父域名,使得兩個(gè)服務(wù)器下頁面之間的cookie可以相互訪問到。
router.get('/createCookie',?async?(ctx,?next)?=>?{ ??ctx.cookies.set('username',?'123',?{ ????maxAge:?60?*?60?*?1000, ????httpOnly:?false, ????path:?'/', ????domain:'.a.com'?//設(shè)置domain為共通的父域名 ??}); ??ctx.body?=?"create?cookie?ok"})router.get('/getCookie',?async?(ctx,?next)?=>?{ ??let?username=ctx.cookies.get('username') ??if?(username){ ????ctx.body=username??}else{ ????ctx.body='no?cookie' ??}})
2. 跨域SSO
當(dāng)我們的域名為www.a.com
,www.b.com
時(shí),無論怎樣設(shè)置domain都沒用了。
那么就要想辦法將身份憑證(token)寫入到所有域的cookie中。
2.1 跨域?qū)慶ookie
2.1.1 利用標(biāo)簽跨域?qū)慶ookie(jsonp)
在http://www.a.com/index.js中直接向https://www.c.com:3000/sso直接發(fā)送網(wǎng)絡(luò)請(qǐng)求,是無法跨域?qū)懭隿ookie的。
??<script> $.ajax({ url: 'https://www.c.com:3000/sso?key=username&value=123', method: 'get', }) </script>
但是我們可以通過標(biāo)簽發(fā)起跨域請(qǐng)求,寫入cookie
<script></script>
或者使用jquery jsonp的方式發(fā)起跨域請(qǐng)求,寫入cookie,這種方式的原理也是通過標(biāo)簽?zāi)軌蚩缬驅(qū)崿F(xiàn)的。
?$.ajax({ ??????url:?'https://www.c.com:3000/sso?key=username&value=123', ??????method:?'get', ??????dataType:'jsonp' ????})
這樣通過標(biāo)簽就實(shí)現(xiàn)了往www.a.com中寫入了domain為www.c.com的跨域cookie.
后端
const?options?=?{ ??key:?fs.readFileSync(path.join(__dirname,?'./https/privatekey.pem')), ??cert:?fs.readFileSync(path.join(__dirname,?'./https/certificate.pem')), ??secureOptions:?'TLSv1_2_method'?//force?TLS?version?1.2}var?server?=?https.createServer(options,app.callback());??//只能使用https協(xié)議寫cookierouter.get('/sso',?async?(ctx,?next)?=>?{ ??let?{ ????key,?value??}?=?ctx.request.query ??ctx.cookies.set(key,?value,?{ ????maxAge:?60?*?60?*?1000,?//有效時(shí)間,單位毫秒 ????httpOnly:?false,?//表示?cookie?是否僅通過?HTTP(S)?發(fā)送,,?且不提供給客戶端?JavaScript?(默認(rèn)為?true). ????path:?'/', ????sameSite:?'none',?//限制第三方?Cookie ????secure:?true?//cookie是否僅通過?HTTPS?發(fā)送 ??}); ??ctx.body?=?'create?Cookie?ok'})
注意:
瀏覽器未寫入cookie報(bào)錯(cuò)
his set-cookie was blocked due to http-only
http-only:表示 cookie 是否僅通過 HTTP(S) 發(fā)送,, 且不提供給客戶端 JavaScript (默認(rèn)為 true).
所以要將httpOnly設(shè)置為false.瀏覽器未寫入cookie報(bào)錯(cuò)
this set-cookie was blocked due to user preference
這個(gè)真的坑,因?yàn)槲沂菬o痕模式打開的瀏覽器,但是chrome瀏覽器默認(rèn)無痕模式下禁用第三方cookie,修改為允許所有cookie就行了.瀏覽器未寫入cookie報(bào)錯(cuò)
this set cookie was blocked because it has the SameSite attribute but Secure not set
需要設(shè)置sameSite和secure屬性-
瀏覽器未寫入cookie報(bào)錯(cuò)
Mais nous pouvons définir l'attribut de domaine du cookie sur un nom de domaine parent commun afin que les cookies entre les pages des deux serveurs soient accessibles l'un depuis l'autre.server error Error: Cannot send secure cookie over unencrypted connection
Par défaut, les cookies entre les pages des deux serveurs ne sont pas accessibles entre eux.
router.get('/sso',?async?(ctx,?next)?=>?{ ??let?{ ????key,?value??}?=?ctx.request.query ??ctx.cookies.set(key,?value,?{ ????maxAge:?60?*?60?*?1000,?//有效時(shí)間,單位毫秒 ????httpOnly:?false, ????path:?'/', ????sameSite:?'none', ????secure:?true ??}); ??ctx.set("P3P",?"CP='CURa?ADMa?DEVa?PSAo?PSDo?OUR?BUS?UNI?PUR?INT?DEM?STA?PRE?COM?NAV?OTC?NOI?DSP?COR'")?//p3p響應(yīng)頭 ??ctx.body?=?'create?Cookie?ok'})

2 . SSO inter-domaines
Lorsque notre nom de domaine est www.a.com
, www.b.com
, peu importe la fa?on dont nous définissons le domaine, cela ne sert à rien .
Ensuite, nous devons trouver un moyen d'écrire les informations d'identification (jeton) dans les cookies de tous les domaines.
??2.1 écrivez des cookies sur plusieurs domaines??
????2.1.1 Utilisez la balise <script></script> pour écrire des cookies sur plusieurs domaines (jsonp)??????sur http://www.a.com /index Si vous envoyez directement une requête réseau à https://www.c.com:3000/sso en .js, vous ne pouvez pas écrire de cookies sur plusieurs domaines. ??router.get('/createToken',?async?(ctx,?next)?=>?{ ??let?{?from?}?=?ctx.request.query??let?token?=?"123"; ??ctx.response.redirect(`${from}?token=${token}`)})??Mais nous pouvons lancer des requêtes inter-domaines via la balise <script></script> et écrire des cookies??
router.get('/createCookie',?async?(ctx,?next)?=>?{ ??let?{?token?}?=?ctx.request.query ??ctx.cookies.set('token',?token,?{ ????maxAge:?60?*?60?*?1000,?//有效時(shí)間,單位毫秒 ????httpOnly:?false, ????path:?'/', ??}); ??ctx.body?=?'set?cookie?ok'})??ou utiliser jquery jsonp pour lancer des requêtes inter-domaines et écrire des cookies. Le principe de cette méthode passe également par peut être implémentée dans tous les domaines. ??
<script></script>??De cette fa?on, via la balise , le cookie inter-domaines avec le domaine www.c.com est écrit sur www.a.com.??

router.get('/readCookie',?async?(ctx,?next)?=>?{ ??let?username?=?ctx.cookies.get('username') ??console.log('cookie',?username)})??Remarque?:?? ??
- ????Le navigateur n'a pas écrit le cookie et a signalé une erreur
son set-cookie a été bloqué en raison de http uniquement
?? http- only?: indique si le cookie est uniquement envoyé via HTTP(S) et n'est pas fourni au client JavaScript (la valeur par défaut est true).?? Définissez donc httpOnly sur false.????????Le navigateur n'a pas écrit le cookie et a signalé une erreur ce set-cookie a été bloqué en raison des préférences de l'utilisateur?? C'est vraiment un piège, car j'ai ouvert le navigateur en mode navigation privée, mais le navigateur Chrome désactive les cookies tiers en mode navigation privée par défaut. pour autoriser tous les cookies.???????? ??Le navigateur n'écrit pas d'erreur de cookiece cookie défini a été bloqué car il a l'attribut SameSite mais Secure n'est pas défini
?? Les attributs sameSite et secure doivent être définis????????Le navigateur n'a pas écrit le cookie et a signalé une erreurerreur de serveur Erreur?: impossible d'envoyer un cookie sécurisé via une connexion non cryptée
?? Je pense qu'il s'agit d'une limitation du framework koa pour l'écriture de cookies. Il ne peut prendre en charge que l'écriture de cookies https..., donc. J'ai changé www.c.com en serveur https.?????????? 2.1.2 L'en-tête du protocole p3p implémente le multi-domaine du navigateur IE ??????La méthode jsonp mentionnée ci-dessus fonctionne parfaitement dans le navigateur Chrome, mais le navigateur IE est plus strict sur les cookies, et le cookie ne peut pas être écrit en utilisant uniquement la méthode ci-dessus. La solution est d'ajouter un en-tête de réponse p3p. ??rrreee????2.1.3 les paramètres d'URL réalisent le transfert d'informations entre domaines??????Visitez http://www.c.com:3000/createToken?from=http://www.a.com/createCookie??www.c.com上生成token后將url重寫,帶上token,重定向到www.a.com
router.get('/createToken',?async?(ctx,?next)?=>?{ ??let?{?from?}?=?ctx.request.query??let?token?=?"123"; ??ctx.response.redirect(`${from}?token=${token}`)})
www.a.com上從url上獲取token,存入cookie
router.get('/createCookie',?async?(ctx,?next)?=>?{ ??let?{?token?}?=?ctx.request.query ??ctx.cookies.set('token',?token,?{ ????maxAge:?60?*?60?*?1000,?//有效時(shí)間,單位毫秒 ????httpOnly:?false, ????path:?'/', ??}); ??ctx.body?=?'set?cookie?ok'})
這樣就實(shí)現(xiàn)了跨域信息的傳遞.與上面的方式不同,這種方法只是單純的http請(qǐng)求,適用于所有瀏覽器,但是缺點(diǎn)也很明顯,每次只能分享給一個(gè)服務(wù)器。
2.2 跨域讀cookie
2.2.1 利用標(biāo)簽跨域讀cookie(jsonp)
之前2.1.1利用標(biāo)簽在www.a.com中寫入了www.c.com的cookie(username,123),現(xiàn)在想要www.a.com請(qǐng)求的時(shí)候攜帶上www.c.com的cookie,也就是說要跨域讀cookie.
其實(shí)也是同樣的方法,在www.a.com上利用跨域訪問訪問www.c.com,會(huì)自動(dòng)的帶上domain為www.c.com的cookie。www.a.com/index.js
<script></script>
www.c.com
router.get('/readCookie',?async?(ctx,?next)?=>?{ ??let?username?=?ctx.cookies.get('username') ??console.log('cookie',?username)})
可以看到讀取到了存儲(chǔ)在www.a.com里面domain為www.c.com的cookie.
3. nodejs實(shí)現(xiàn)單點(diǎn)登錄系統(tǒng)實(shí)戰(zhàn)
效果如圖所示:
第一次訪問www.a.com首頁
跳轉(zhuǎn)到www.c.com:3000登錄頁面,登錄成功后跳轉(zhuǎn)www.a.com首頁
再次訪問www.a.com首頁,無需登錄直接跳轉(zhuǎn)
訪問www.b.com首頁,無需登錄直接跳轉(zhuǎn)
源碼: https://github.com/wantao666/sso-nodejs
詳細(xì)設(shè)計(jì):
更多node相關(guān)知識(shí),請(qǐng)?jiān)L問:nodejs 教程!
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Il existe deux fichiers liés à npm dans le répertoire d'installation de Node.js?: npm et npm.cmd. Les différences sont les suivantes?: différentes extensions?: npm est un fichier exécutable et npm.cmd est un raccourci de fenêtre de commande. Utilisateurs Windows?: npm.cmd peut être utilisé à partir de l'invite de commande, npm ne peut être exécuté qu'à partir de la ligne de commande. Compatibilité : npm.cmd est spécifique aux systèmes Windows, npm est disponible multiplateforme. Recommandations d'utilisation?: les utilisateurs Windows utilisent npm.cmd, les autres systèmes d'exploitation utilisent npm.

Explication détaillée et guide d'installation pour les n?uds de pignon Cet article introduira l'écosystème de pignon en détail - n?uds PI, un r?le clé dans l'écosystème de pignon et fournir des étapes complètes pour l'installation et la configuration. Après le lancement du réseau de test de la blockchain pèse, les n?uds PI sont devenus une partie importante de nombreux pionniers participant activement aux tests, se préparant à la prochaine version du réseau principal. Si vous ne connaissez pas encore Pinetwork, veuillez vous référer à ce qu'est Picoin? Quel est le prix de l'inscription? PI Utilisation, exploitation minière et sécurité. Qu'est-ce que Pinetwork? Le projet Pinetwork a commencé en 2019 et possède sa pièce exclusive de crypto-monnaie PI. Le projet vise à en créer un que tout le monde peut participer

Node.js peut être utilisé comme framework backend car il offre des fonctionnalités telles que des performances élevées, l'évolutivité, la prise en charge multiplateforme, un écosystème riche et une facilité de développement.

Oui, Node.js peut être utilisé pour le développement front-end, et les principaux avantages incluent des performances élevées, un écosystème riche et une compatibilité multiplateforme. Les considérations à prendre en compte sont la courbe d’apprentissage, la prise en charge des outils et la petite taille de la communauté.

Les variables globales suivantes existent dans Node.js?: Objet global?: global Module principal?: processus, console, nécessiter Variables d'environnement d'exécution?: __dirname, __filename, __line, __column Constantes?: undefined, null, NaN, Infinity, -Infinity

Oui, Node.js est un langage de développement backend. Il est utilisé pour le développement back-end, notamment la gestion de la logique métier c?té serveur, la gestion des connexions à la base de données et la fourniture d'API.

Pour vous connecter à une base de données MySQL, vous devez suivre ces étapes : Installez le pilote mysql2. Utilisez mysql2.createConnection() pour créer un objet de connexion contenant l'adresse de l'h?te, le port, le nom d'utilisateur, le mot de passe et le nom de la base de données. Utilisez connection.query() pour effectuer des requêtes. Enfin, utilisez connection.end() pour mettre fin à la connexion.

Node.js convient aux types de projets suivants?: Applications réseau et serveur Applications basées sur des événements Applications en temps réel Applications gourmandes en données Outils et scripts en ligne de commande Microservices légers
