シングルサインオンシステムとは何ですか? Nodejsを使用して実装するにはどうすればよいですか?
シングル サインオン システムとは何ですか? Nodejsを使用して実装するにはどうすればよいですか?次の記事ではnodeを使ってシングルサインオンシステムを実現する方法を紹介しますので、参考になれば幸いです。
シングルサインオン SSO(シングルサインオン)とは、複数の業務システムのログイン機能を分離し、新たなシステムを構築することで、一度ログインすれば業務システムにログインする必要がなくなります。
1. 基本知識
1.1 同一生成元ポリシー
ソース = プロトコルドメイン名ポート
http://www.a.com を例に挙げます:
- https://www.a.com ❌(異なるプロトコル)
- http://www.b.com ❌(ドメイン名が異なります)
- http://www.a.com:3000 ❌(ポートが異なります)
同一生成元ポリシーのブラウジング アプリケーション配下のリソースにこのアプリケーションのみがアクセスできるようにすることでセキュリティを確保するサーバーの動作。
1.2 セッション メカニズム
http プロトコルは ステートレス プロトコルであるため、(クライアントとサーバー間のデータ交換は接続は閉じられ、次回リクエストが行われたときに接続が再確立されます)、ただし、パスワードを記憶するなどの機能を実行する必要がある場合、セッションを記録する必要があることは明らかです。 [関連チュートリアルの推奨事項: nodejs ビデオ チュートリアル ]
一般的に使用されるセッション トラッキングは Cookie とセッションです。簡単に理解すると、キーと値を保存できるデータ構造です。違いは次のとおりです。 Cookie はクライアントに保存されます。サーバー側では、セッションはサーバー側に保存されます。
2. シングル サインオン
1. 同じ親ドメイン SSO
同じ親ドメイン (例: www.app1.aaa.com
、www.app2.aaa.com
これら 2 つのサーバーは、.aaa.com の親ドメイン名です。
デフォルトでは、2 つのサーバー上のページ間の Cookie は相互にアクセスできません。
しかし、Cookie のドメイン属性を共通の親ドメイン名に設定して、2 つのサーバー上のページ間の Cookie に相互にアクセスできるようにすることができます。
router.get('/createCookie', async (ctx, next) => { ctx.cookies.set('username', '123', { maxAge: 60 * 60 * 1000, httpOnly: false, path: '/', domain:'.a.com' //设置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
ドメイン名が www の場合。 .com
、www.b.com
、どのようにドメインを設定しても役に立ちません。
次に、すべてのドメインの Cookie に ID 資格情報 (トークン) を書き込む方法を見つける必要があります。
2.1 ドメイン間での Cookie の書き込み
2.1.1 タグを使用してドメイン間で Cookie を書き込む (jsonp)
http://www.a.com/index.js の https://www.c.com:3000/sso にネットワーク リクエストを直接送信すると、クロスドメイン Cookie を書き込むことができません。<script> $.ajax({ url: 'https://www.c.com:3000/sso?key=username&value=123', method: 'get', }) </script>
<script></script>
$.ajax({ url: 'https://www.c.com:3000/sso?key=username&value=123', method: 'get', dataType:'jsonp' })
に書き込まれます。 バックエンド
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协议写cookierouter.get('/sso', async (ctx, next) => { let { key, value } = ctx.request.query ctx.cookies.set(key, value, { maxAge: 60 * 60 * 1000, //有效时间,单位毫秒 httpOnly: false, //表示 cookie 是否仅通过 HTTP(S) 发送,, 且不提供给客户端 JavaScript (默认为 true). path: '/', sameSite: 'none', //限制第三方 Cookie secure: true //cookie是否仅通过 HTTPS 发送 }); ctx.body = 'create Cookie ok'})
注:
- ブラウザは Cookie を書き込めず、エラーを報告しました
彼の設定した Cookie はhttp-only のためブロックされました
http-only: Cookie が HTTP(S) 経由でのみ送信され、クライアント JavaScript に提供されないかどうかを示します (デフォルトは true)。
したがって、httpOnly を false に設定します。 . - ブラウザは Cookie を書き込めず、エラーを報告しました
この set-Cookie はユーザー設定によりブロックされました
これは本当に落とし穴です。ブラウザをシークレット モードで開きました。ただし、Chrome ブラウザではデフォルトでシークレット モードのサードパーティ Cookie が無効になっています。すべての Cookie を許可するように変更してください。
- ブラウザは Cookie を書き込まず、エラーを報告します
SameSite 属性があるが Secure が設定されていないため、この設定された Cookie はブロックされました
SameSite 属性と Secure 属性を設定する必要があります
##ブラウザが Cookie を書き込まず、エラーを報告する - サーバー エラー エラー: 暗号化されていない接続で安全な Cookie を送信できません
上記の jsonp メソッドは、Chrome ブラウザで完全に実行されます。ただし、IE ブラウザは Cookie に対してより厳密であるため、上記のメソッドを使用して Cookie を書き込むことができません。解決策は、p3p 応答ヘッダーを追加することです。 。これは、Cookie を書き込むための koa フレームワークの制限だと思います。 https による Cookie の書き込みのみをサポートできるため、www.c.com を https サーバーに変更しました。ドメイン
router.get('/sso', async (ctx, next) => { let { key, value } = ctx.request.query ctx.cookies.set(key, value, { maxAge: 60 * 60 * 1000, //有效时间,单位毫秒 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响应头 ctx.body = 'create Cookie ok'})
2.1.3 クロスドメイン情報転送を実現するための URL パラメーター
http://www.c.com:3000/createToken?from=http にアクセスしてください。 // www.a.com/createCookiewww.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, //有效时间,单位毫秒 httpOnly: false, path: '/', }); ctx.body = 'set cookie ok'})
这样就实现了跨域信息的传递.与上面的方式不同,这种方法只是单纯的http请求,适用于所有浏览器,但是缺点也很明显,每次只能分享给一个服务器。
2.2 跨域读cookie
2.2.1 利用标签跨域读cookie(jsonp)
之前2.1.1利用标签在www.a.com中写入了www.c.com的cookie(username,123),现在想要www.a.com请求的时候携带上www.c.com的cookie,也就是说要跨域读cookie.
其实也是同样的方法,在www.a.com上利用跨域访问访问www.c.com,会自动的带上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)})
可以看到读取到了存储在www.a.com里面domain为www.c.com的cookie.
3. nodejs实现单点登录系统实战
效果如图所示:
第一次访问www.a.com首页
跳转到www.c.com:3000登录页面,登录成功后跳转www.a.com首页
再次访问www.a.com首页,无需登录直接跳转
访问www.b.com首页,无需登录直接跳转
源码: https://github.com/wantao666/sso-nodejs
详细设计:
更多node相关知识,请访问:nodejs 教程!
以上がシングルサインオンシステムとは何ですか? Nodejsを使用して実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Node.js は、高いパフォーマンス、スケーラビリティ、クロスプラットフォーム サポート、豊富なエコシステム、開発の容易さなどの機能を備えているため、バックエンド フレームワークとして使用できます。

MySQL データベースに接続するには、次の手順に従う必要があります。 mysql2 ドライバーをインストールします。 mysql2.createConnection() を使用して、ホスト アドレス、ポート、ユーザー名、パスワード、データベース名を含む接続オブジェクトを作成します。 connection.query() を使用してクエリを実行します。最後に connection.end() を使用して接続を終了します。

Node.js には次のグローバル変数が存在します。 グローバル オブジェクト: グローバル コア モジュール: プロセス、コンソール、require ランタイム環境変数: __dirname、__filename、__line、__column 定数: unknown、null、NaN、Infinity、-Infinity

Node.js インストール ディレクトリには、npm と npm.cmd という 2 つの npm 関連ファイルがあります。違いは次のとおりです。拡張子が異なります。npm は実行可能ファイルで、npm.cmd はコマンド ウィンドウのショートカットです。 Windows ユーザー: npm.cmd はコマンド プロンプトから使用できますが、npm はコマンド ラインからのみ実行できます。互換性: npm.cmd は Windows システムに固有ですが、npm はクロスプラットフォームで使用できます。使用上の推奨事項: Windows ユーザーは npm.cmd を使用し、他のオペレーティング システムは npm を使用します。

Node.js と Java の主な違いは、設計と機能です。 イベント駆動型とスレッド駆動型: Node.js はイベント駆動型で、Java はスレッド駆動型です。シングルスレッドとマルチスレッド: Node.js はシングルスレッドのイベント ループを使用し、Java はマルチスレッド アーキテクチャを使用します。ランタイム環境: Node.js は V8 JavaScript エンジン上で実行され、Java は JVM 上で実行されます。構文: Node.js は JavaScript 構文を使用し、Java は Java 構文を使用します。目的: Node.js は I/O 集中型のタスクに適しており、Java は大規模なエンタープライズ アプリケーションに適しています。

はい、Node.js はバックエンド開発言語です。これは、サーバー側のビジネス ロジックの処理、データベース接続の管理、API の提供などのバックエンド開発に使用されます。

ピン張りのノードの詳細な説明とインストールガイドこの記事では、ピネットワークのエコシステムを詳細に紹介します - PIノードは、ピン系生態系における重要な役割であり、設置と構成の完全な手順を提供します。 Pinetworkブロックチェーンテストネットワークの発売後、PIノードは多くの先駆者の重要な部分になり、テストに積極的に参加し、今後のメインネットワークリリースの準備をしています。まだピン張りのものがわからない場合は、ピコインとは何かを参照してください。リストの価格はいくらですか? PIの使用、マイニング、セキュリティ分析。パインワークとは何ですか?ピン競技プロジェクトは2019年に開始され、独占的な暗号通貨PIコインを所有しています。このプロジェクトは、誰もが参加できるものを作成することを目指しています

Node.js プロジェクトのサーバー デプロイメント手順: デプロイメント環境を準備します。サーバー アクセスの取得、Node.js のインストール、Git リポジトリのセットアップ。アプリケーションをビルドする: npm run build を使用して、デプロイ可能なコードと依存関係を生成します。コードをサーバーにアップロードします: Git またはファイル転送プロトコル経由。依存関係をインストールする: サーバーに SSH で接続し、npm install を使用してアプリケーションの依存関係をインストールします。アプリケーションを開始します。node Index.js などのコマンドを使用してアプリケーションを開始するか、pm2 などのプロセス マネージャーを使用します。リバース プロキシの構成 (オプション): Nginx や Apache などのリバース プロキシを使用して、トラフィックをアプリケーションにルーティングします。
