ホームページ  >  記事  >  ウェブフロントエンド  >  シングルサインオンシステムとは何ですか? Nodejsを使用して実装するにはどうすればよいですか?

シングルサインオンシステムとは何ですか? Nodejsを使用して実装するにはどうすればよいですか?

青灯夜游
青灯夜游転載
2023-02-24 19:33:332158ブラウズ

シングル サインオン システムとは何ですか? Nodejsを使用して実装するにはどうすればよいですか?次の記事ではnodeを使ってシングルサインオンシステムを実現する方法を紹介しますので、参考になれば幸いです。

シングルサインオンシステムとは何ですか? Nodejsを使用して実装するにはどうすればよいですか?

シングルサインオン 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.comwww.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'
  }})

シングルサインオンシステムとは何ですか? Nodejsを使用して実装するにはどうすればよいですか?

2. クロスドメイン SSO

ドメイン名が www の場合。 .comwww.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: &#39;https://www.c.com:3000/sso?key=username&value=123&#39;,
      method: &#39;get&#39;,
    })
  </script>
ただし、<script></script> タグを使用してクロスドメイン リクエストを開始し、Cookie を書き込むこともできます

<script></script>
または、jquery jsonp を使用してクロスドメイン リクエストを開始し、Cookie を書き込むこともできます。このメソッドの原理は、 タグを使用してドメイン間で実装することもできます。

 $.ajax({
      url: 'https://www.c.com:3000/sso?key=username&value=123',
      method: 'get',
      dataType:'jsonp'
    })
このように、 タグを通じて、www.c.com のドメインを持つクロスドメイン Cookie が www.a.com.


に書き込まれます。 シングルサインオンシステムとは何ですか? 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协议写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 を許可するように変更してください。

    シングルサインオンシステムとは何ですか? Nodejsを使用して実装するにはどうすればよいですか?

  • ブラウザは Cookie を書き込まず、エラーを報告します

    SameSite 属性があるが Secure が設定されていないため、この設定された Cookie はブロックされました SameSite 属性と Secure 属性を設定する必要があります

  • ##ブラウザが Cookie を書き込まず、エラーを報告する
  • サーバー エラー エラー: 暗号化されていない接続で安全な Cookie を送信できません

    これは、Cookie を書き込むための koa フレームワークの制限だと思います。 https による Cookie の書き込みのみをサポートできるため、www.c.com を https サーバーに変更しました。ドメイン

    上記の jsonp メソッドは、Chrome ブラウザで完全に実行されます。ただし、IE ブラウザは Cookie に対してより厳密であるため、上記のメソッドを使用して Cookie を書き込むことができません。解決策は、p3p 応答ヘッダーを追加することです。 。
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/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, //有效时间,单位毫秒
    httpOnly: false,
    path: '/',
  });
  ctx.body = 'set cookie ok'})

这样就实现了跨域信息的传递.与上面的方式不同,这种方法只是单纯的http请求,适用于所有浏览器,但是缺点也很明显,每次只能分享给一个服务器。
シングルサインオンシステムとは何ですか? Nodejsを使用して実装するにはどうすればよいですか?

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

シングルサインオンシステムとは何ですか? Nodejsを使用して実装するにはどうすればよいですか?
可以看到读取到了存储在www.a.com里面domain为www.c.com的cookie.

3. nodejs实现单点登录系统实战

シングルサインオンシステムとは何ですか? Nodejsを使用して実装するにはどうすればよいですか?
效果如图所示:

  • 第一次访问www.a.com首页

  • 跳转到www.c.com:3000登录页面,登录成功后跳转www.a.com首页

  • 再次访问www.a.com首页,无需登录直接跳转

  • 访问www.b.com首页,无需登录直接跳转

源码: https://github.com/wantao666/sso-nodejs

详细设计:
シングルサインオンシステムとは何ですか? Nodejsを使用して実装するにはどうすればよいですか?

更多node相关知识,请访问:nodejs 教程

以上がシングルサインオンシステムとは何ですか? Nodejsを使用して実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。