亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

Table des matières
1. Connaissances de base
1.1 Même politique d'origine " >1.1 Même politique d'origine
1.2 Mécanisme de session " >1.2 Mécanisme de session
2. Authentification unique
1. Même domaine parent SSO" >1. Même domaine parent SSO
2. 跨域SSO" >2. 跨域SSO
2.1 跨域?qū)慶ookie
2.1.1 利用標(biāo)簽跨域?qū)慶ookie(jsonp)
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 .
??2.1 écrivez des cookies sur plusieurs domaines??
2.2 跨域讀cookie
2.2.1 利用標(biāo)簽跨域讀cookie(jsonp)
3. nodejs實(shí)現(xiàn)單點(diǎn)登錄系統(tǒng)實(shí)戰(zhàn)
Maison interface Web js tutoriel Qu'est-ce qu'un système d'authentification unique?? Comment l'implémenter en utilisant nodejs ?

Qu'est-ce qu'un système d'authentification unique?? Comment l'implémenter en utilisant nodejs ?

Feb 24, 2023 pm 07:33 PM
nodejs node Système de connexion unique

Qu'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?!

Qu'est-ce qu'un système d'authentification unique?? Comment l'implémenter en utilisant nodejs ?

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.comLes 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'
??}})

Quest-ce quun système dauthentification unique?? Comment limplémenter en utilisant nodejs ?

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: &#39;https://www.c.com:3000/sso?key=username&value=123&#39;,
      method: &#39;get&#39;,
    })
  </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.
Quest-ce quun système dauthentification unique?? Comment limplémenter en utilisant nodejs ?
后端

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就行了.
    Quest-ce quun système dauthentification unique?? Comment limplémenter en utilisant nodejs ?

  • 瀏覽器未寫入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ò)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.

    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.
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'})
Insérer la description de l'image ici
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.??Insérer la description de l'image ici?? Backend??
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 erreurson 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ù)器。
Quest-ce quun système dauthentification unique?? Comment limplémenter en utilisant nodejs ?

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)})

Quest-ce quun système dauthentification unique?? Comment limplémenter en utilisant nodejs ?
可以看到讀取到了存儲(chǔ)在www.a.com里面domain為www.c.com的cookie.

3. nodejs實(shí)現(xiàn)單點(diǎn)登錄系統(tǒng)實(shí)戰(zhàn)

Quest-ce quun système dauthentification unique?? Comment limplémenter en utilisant nodejs ?
效果如圖所示:

  • 第一次訪問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ì):
Quest-ce quun système dauthentification unique?? Comment limplémenter en utilisant nodejs ?

更多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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefa?on, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

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?!

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

Quelle est la différence entre les fichiers npm et npm.cmd dans le répertoire d'installation de nodejs ? Quelle est la différence entre les fichiers npm et npm.cmd dans le répertoire d'installation de nodejs ? Apr 21, 2024 am 05:18 AM

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.

Enseignement du n?ud PI: Qu'est-ce qu'un n?ud PI? Comment installer et configurer le n?ud PI? Enseignement du n?ud PI: Qu'est-ce qu'un n?ud PI? Comment installer et configurer le n?ud PI? Mar 05, 2025 pm 05:57 PM

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

Nodejs est-il un framework backend ? Nodejs est-il un framework backend ? Apr 21, 2024 am 05:09 AM

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.

Nodejs peut-il écrire du front-end ? Nodejs peut-il écrire du front-end ? Apr 21, 2024 am 05:00 AM

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é.

Quelles sont les variables globales dans nodejs Quelles sont les variables globales dans nodejs Apr 21, 2024 am 04:54 AM

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

Nodejs est-il un langage de développement back-end ? Nodejs est-il un langage de développement back-end ? Apr 21, 2024 am 05:09 AM

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.

Comment connecter Nodejs à la base de données MySQL Comment connecter Nodejs à la base de données MySQL Apr 21, 2024 am 06:13 AM

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.

Pour quels projets nodejs est-il adapté ? Pour quels projets nodejs est-il adapté ? Apr 21, 2024 am 05:45 AM

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

See all articles