亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

nodejs實現(xiàn)OAuth2.0授權服務認證

 更新時間:2017年12月27日 16:26:34   作者:西安-晁州  
本篇文章主要介紹了nodejs實現(xiàn)OAuth2.0授權服務認證,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

OAuth是一種開發(fā)授權的網(wǎng)絡標準,全拼為open authorization,即開放式授權,最新的協(xié)議版本是2.0。

舉個栗子:

有一個"云沖印"的網(wǎng)站,可以將用戶儲存在Google的照片,沖印出來。用戶為了使用該服務,必須讓"云沖印"讀取自己儲存在Google上的照片。

傳統(tǒng)方法是,用戶將自己的Google用戶名和密碼,告訴"云沖印",后者就可以讀取用戶的照片了。這樣的做法有以下幾個嚴重的缺點。

  1. "云沖印"為了后續(xù)的服務,會保存用戶的密碼,這樣很不安全。
  2. Google不得不部署密碼登錄,而我們知道,單純的密碼登錄并不安全。
  3. "云沖印"擁有了獲取用戶儲存在Google所有資料的權力,用戶沒法限制"云沖印"獲得授權的范圍和有效期。
  4. 用戶只有修改密碼,才能收回賦予"云沖印"的權力。但是這樣做,會使得其他所有獲得用戶授權的第三方應用程序全部失效。
  5. 只要有一個第三方應用程序被破解,就會導致用戶密碼泄漏,以及所有被密碼保護的數(shù)據(jù)泄漏。

所以OAuth就誕生了!

  1. Third-party application:第三方應用程序,本文中又稱"客戶端"(client),即上一節(jié)例子中的"云沖印"。
  2. HTTP service:HTTP服務提供商,本文中簡稱"服務提供商",即上一節(jié)例子中的Google。
  3. Resource Owner:資源所有者,本文中又稱"用戶"(user)。
  4. User Agent:用戶代理,本文中就是指瀏覽器。
  5. Authorization server:認證服務器,即服務提供商專門用來處理認證的服務器。
  6. Resource server:資源服務器,即服務提供商存放用戶生成的資源的服務器。它與認證服務器,可以是同一臺服務器,也可以是不同的服務器。

登錄層提供令牌(token)的生成,其中token包括:有效期、權限范圍??蛻舳四玫絫oken去訪問受限資源。

  1. access_token:請求資源時需要攜帶的token,即訪問token。
  2. refresh_token:刷新token,如果access_token過期,可以使用該token獲取一份新的access_token和新的refresh_token。一般refresh_token時效性較長,比如一年,而access_token時效性較短,比如幾分鐘。
  3. 權限范圍:即指定客戶端可以獲取的資源權限范圍。

OAuth授權模式

OAuth有四種授權模式,分別為:

  1. 授權碼模式(authorization code)
  2. 簡化模式(implicit)
  3. 密碼模式(resource owner password credentials)
  4. 客戶端模式(client credentials)

1、授權碼模式

授權碼模式是最為嚴密的授權模式,整體流程為:瀏覽器攜帶必要信息至授權頁面,正常登錄成功后,返回一個code(授權碼),客戶端拿到code后在后臺獲取拿code換取token。

2、密碼模式

密碼模式,簡單地理解即為使用用戶名密碼等參數(shù)獲取access_token,它的步驟如下:

  1. 用戶向客戶端提供用戶名和密碼。
  2. 客戶端將用戶名和密碼發(fā)給認證服務器,向后者請求令牌。
  3. 認證服務器確認無誤后,向客戶端提供訪問令牌。

3、refresh_token的應用

refresh_token被用來獲取新的access_token和refresh_token,使用方式簡單如下:

refresh_token無效:

使用nodejs實現(xiàn)OAuth授權服務

技術棧:

  1. nodejs + eggjs
  2. eggjs-oAuth-server插件

具體可以參考:
https://github.com/Azard/egg-oauth2-server
https://cnodejs.org/topic/592b2aedba8670562a40f60b

1、code grant模式測試及單點登錄實現(xiàn)

這里我們構建兩個站點,一個是7001端口(授權服務),一個是7002端口(客戶端),授權模式為code grant。

首先是客戶端登錄頁:

單擊按鈕后直接登錄:

可以發(fā)現(xiàn),瀏覽器重定向到授權服務地址,并攜帶了response_type、client_id、redirect_uri三個參數(shù),登錄成功后,瀏覽器會重定向到redirect_uri指定的地址,即這里的*http://127.0.0.1:7002/auth/redirect*:

如下為授權服務的登錄頁寫法

<form action="/oauth2/authorize?{{query}}" id="form1" name="f" method="post">
  <div class="input_outer">
    <span class="u_user"></span>
    <input name="username" class="text" style="color: #FFFFFF !important" type="text" placeholder="請輸入賬戶">
  </div>
  <div class="input_outer">
    <span class="us_uer"></span>
    <input name="password" class="text" style="color: #FFFFFF !important; position:absolute; z-index:100;"value="" type="password" placeholder="請輸入密碼">
  </div>
  <div class="mb2"><a class="act-but submit" href="javascript:;" rel="external nofollow" onclick="document.getElementById('form1').submit()" style="color: #FFFFFF">登錄</a></div>
</form>

這里的${query}即為客戶端登錄重定向攜帶的完整query,然后是/oauth2/authorize路由的寫法:

app.all('/oauth2/authorize', app.oAuth2Server.authorize());// 獲取授權碼

這里調用app.oAuth2Server.authorize()時,插件會自動執(zhí)行重定向操作,首先是重定向到客戶端指定地址,客戶端拿到code和state后,再去授權層獲取token:

async redirect(){
  // 服務端重定向過來的
  console.log(this.ctx.query)
  const result = await this.ctx.curl('http://127.0.0.1:7001/users/token', {
   dataType: 'json',
   // contentType: 'application/x-www-form-urlencoded', // 默認格式
   method: 'POST',
   timeout: 3000,
   data: {
    grant_type: 'authorization_code',
    code: this.ctx.query.code,
    state: this.ctx.query.state,
    client_id: client_id,
    client_secret: client_secret,
    redirect_uri: redirect_uri,
   }
  });
  this.ctx.body = result.data;
 }

獲取到token后正常返回:

2、password grant模式測試

首先使用username、password獲取access_token:

用戶名或密碼錯誤時返回:

使用token獲取授權資源正常返回:

以上內(nèi)容完整源碼參考:https://github.com/caiya/eggjs-oAuth2-server

總結

  1. OAuth實際使用時要上https,包括客戶端和授權服務端
  2. 授權服務可以使用私鑰簽名,客戶端使用公鑰驗證,從而保證數(shù)據(jù)安全性

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 在Mac OS上安裝使用Node.js的項目自動化構建工具Gulp

    在Mac OS上安裝使用Node.js的項目自動化構建工具Gulp

    Gulp是一個在使用上比Grunt更加簡潔的自動化工具(文中附有對比),和Node的npm包管理器配合使用非常方便,下面就記錄一下在Mac OS上安裝使用Node.js的項目自動化構建工具Gulp的方法:
    2016-06-06
  • express框架中使用jwt實現(xiàn)驗證的方法

    express框架中使用jwt實現(xiàn)驗證的方法

    這篇文章主要給大家介紹了關于express框架中使用jwt實現(xiàn)驗證的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用express具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-08-08
  • Node.js如何響應Ajax的POST請求并且保存為JSON文件詳解

    Node.js如何響應Ajax的POST請求并且保存為JSON文件詳解

    這篇文章主要介紹了關于Node.js是如何響應Ajax的POST請求并且保存為JSON文件的相關資料,文中介紹的很詳細,對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。
    2017-03-03
  • NodeJS多種創(chuàng)建WebSocket監(jiān)聽的方式(三種)

    NodeJS多種創(chuàng)建WebSocket監(jiān)聽的方式(三種)

    這篇文章主要介紹了NodeJS多種創(chuàng)建WebSocket監(jiān)聽的方式,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • 最新評論