成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Vue.js 2.0 基于OAuth2.0的第三方登錄組件

RancherLabs / 1051人閱讀

摘要:第三方登錄是現(xiàn)在常見的登錄方式,免注冊且安全方便快捷。大部分的第三方登錄都參考了的認證方法。這里我主要總結一下第三方登錄組件的設計流程。身份認證組件,需解耦,至少要喚起登錄和登出事件。認證成功喚起登錄事件并將用戶信息傳遞出去。

第三方登錄是現(xiàn)在常見的登錄方式,免注冊且安全方便快捷。

本篇文章將以Github為例,介紹如何在自己的站點添加第三方登錄模塊。

OAuth2.0
OAuth(開放授權)是一個開放標準,允許用戶讓第三方應用訪問該用戶在某一網(wǎng)站上存儲的私密的資源(如照片,視頻,聯(lián)系人列表),而無需將用戶名和密碼提供給第三方應用。

更多關于OAuth2.0的信息請訪問 OAuth 2.0 — OAuth

實際使用只需要知道:

提供方儲存了用戶的信息,ID,Name,Email等。

客戶端通過提供方指定的頁面發(fā)起請求,獲取token。

客戶端通過token獲得用戶信息。

Github

詳細的認證過程請訪問官方文檔 Authorization options for OAuth Apps,這里我對一般的web app請求認證的過程做一下總結。

GIthub的具體認證流程:

用戶點擊登錄按鈕跳轉至Github提供的授權界面,并提供參數(shù):客戶端ID(稍后會介紹到),回調(diào)頁面等。

GET https://github.com/login/oauth/authorize

參數(shù)

名稱 類型 描述
client_id string 必需。GitHub的客戶端ID 。
redirect_uri string 回調(diào)地址,默認返回申請時設置的回調(diào)地址。
scope string 以空格分隔的授權列表。eg:user repo 不提供則默認返回這兩種。
state string 客戶端提供的一串隨機字符。它用于防止跨站請求偽造攻擊。
allow_signup string 如果用戶未注冊Github,是否提供注冊相關的信息,默認是true。

通過驗證后頁面跳轉至之前提供的回調(diào)頁面,url中包含相關參數(shù):code和state。

客戶端以POST的方式訪問GIthub提供的地址,提供參數(shù)code等。

POST https://github.com/login/oauth/access_token

參數(shù)

名稱 類型 描述
client_id string 必需。GitHub的客戶端ID 。
client_secret string 必需。Github提供的一串隨機字符串。
code string 必需。上一步收到的code
redirect_uri string 之前提供redirect_uri
state string 之前提供的state

Github返回數(shù)據(jù), 包含accesstoken。根據(jù)不同的Accept標頭返回不同格式,推薦json。

Accept: application/json
{"access_token":"e72e16c7e42f292c6912e7710c838347ae178b4a", "scope":"repo,gist", "token_type":"bearer"}

客戶端以GET的方式訪問Github提供的地址,在參數(shù)中加入或在head中加入accesstoken。

GET https://api.github.com/user?access_token=...
curl -H "Authorization: token OAUTH-TOKEN" https://api.github.com/user

Github返回用戶的json數(shù)據(jù)。

大部分的第三方登錄都參考了Github的認證方法。

Vue.js

不用多說,Vue.js。這里我主要總結一下第三方登錄組件的設計流程。

組件

以博客系統(tǒng)為例,可分為三類:

主頁,所有組件的parent。

身份認證組件,需解耦,至少要喚起登錄和登出事件。

其他需要身份認證的組件。

身份認證組件(auth)

組件的職能可概括為以下幾點:

未登陸狀態(tài)時顯示登陸按鈕,登陸狀態(tài)時顯示注銷按鈕。

點擊登錄按鈕時,頁面發(fā)生跳轉。

監(jiān)視地址欄有無code和正確state出現(xiàn)。如果出現(xiàn)開始身份認證。

認證成功喚起登錄事件并將用戶信息傳遞出去。

用戶點擊登出喚起登出事件。

更全面的,出于方便考慮以及Auth2.0的特性,accesstoken可以存放至cookie以實現(xiàn)一定時間內(nèi)免登陸且不用擔心密碼泄露。響應的在用戶認證成功和登出時需要對cookie進行設置和清除操作。

那么開始最主要組件auth的編寫

首先進行準備工作,訪問Github -> settings -> Developer settings 填寫相關信息創(chuàng)建 Oauth App。

注意: 此處設置的 Authorization callback URL 即為客戶端的回調(diào)頁面??蛻舳松暾垟y帶的參數(shù)與這個地址不同會報相應的錯誤。

得到client信息后就可以在auth組件內(nèi)設置字段了。

" @/components/GithubAuth.vue "
data () {
    return {
      client_id: "your client ID",
      client_secret: "your client secret",
      scope: "read:user", // Grants access to read a user"s profile data.
      state: "your state",
      getCodeURL: "https://github.com/login/oauth/authorize",
      getAccessTokenURL: "/github/login/oauth/access_token", 
      getUserURl: "https://api.github.com/user",
      redirectURL: null,
      code: null,
      accessToken: null,
      signState: false
    }
  }

模板中加入登錄按鈕, 保存之前的地址至cookie以便登錄后回調(diào),跳轉至授權頁面。

登錄
saveURL: function () {
      if (Query.parse(location.search).state !== this.state) {
        this.$cookie.set("redirectURL", location.href, 1)
        location.href = this.getCodeURL
      }
    }
A Vue.js plugin for manipulating cookies.   ---vue-cookie 

Parse and stringify URL. ---query strings

組件創(chuàng)建后,檢查地址欄是否存在有效code。如果存在則進行相應處理,獲取有效accesstoken存入cookie,頁面回調(diào)至登錄之前保存的地址。 如果不存在則檢查cookie內(nèi)是否存在accesstoken 獲取用戶信息。

注意: 需要計算得到的屬性務必在computed下定義。

computed: {
    formatCodeURL: function () {
      return this.getCodeURL + ("?" + Query.stringify({
        client_id: this.client_id,
        scope: this.scope,
        state: this.state
      }))
    }
  }
 created: function () {
    this.getCode()
    // when code in url
    if (this.code) this.getAccessToken()
    else {
      // if no code in top, get accessToken from cookie
      this.accessToken = this.$cookie.get("accessToken")
      if (this.accessToken) this.getUser()
    }
  }

獲取地址欄攜帶的code參數(shù)的處理:getCode()

getCode: function () {
      this.getCodeURL += ("?" + Query.stringify({
        client_id: this.client_id,
        scope: this.scope,
        state: this.state
      }))
      let parse = Query.parse(location.search)
      if (parse.state === this.state) {
        this.code = parse.code
      }
    }

利用code獲取accesstoken的處理: getAccessToken()

getAccessToken: function () {
      this.axios.post(this.getAccessTokenURL, {
        client_id: this.client_id,
        client_secret: this.client_secret,
        code: this.code,
        state: this.state
      }).then((response) => {
        this.accessToken = response.data.access_token
        if (this.accessToken) {
          // save to cookie 30 days
          this.$cookie.set("accessToken", this.accessToken, 30)
          this.redirectURL = this.$cookie.get("redirectURL")
          if (this.redirectURL) {
            location.href = this.redirectURL
          }
        }
      })
    }
A small wrapper for integrating axios to Vuejs.    ---vue-axios

要說的是,因為axios是基于promise的異步操作,所以使用時應當特別注意。頁面跳轉放在回調(diào)函數(shù)里是為了防止promise還未返回時頁面就發(fā)生跳轉。

重要 :包括ajax,fetch在內(nèi)的向后臺提交資源的操作都存在跨域問題。瀏覽器同源政策及其規(guī)避方法(阮一峰)。 這里利用了代理的方法,使用vue-cli時可通過配置文件臨時設置代理規(guī)避跨域問題。在生產(chǎn)環(huán)境下需要配置服務器代理至其他域名。

" $/config/index.js "
proxyTable: {
      "/github": {
        target: "https://github.com",
        changeOrigin: true,
        pathRewrite: {
            "^/github": "/"
        }
    }

/github會在請求發(fā)起時被解析為target。設置完成后中斷熱重載重新編譯,重新編譯,重新編譯。

利用accesstoken獲取用戶信息的處理:getUser()

getUser: function () {
      this.axios.get(this.getUserURl + "?access_token=" + this.accessToken)
        .then((response) => {
          let data = response.data
          this.signState = true
          // call parent login event
          this.$emit("loginEvent", {
            login: data.login,
            avatar: data.avatar_url,
            name: data.name
          })
        })
        // invaild accessToken
        .catch((error) => {
          console.log(error)
          this.$cookie.delete("accessToken")
        })
    }

請求用戶信息成功后觸發(fā)了loginEvent事件,并以當前用戶信息作為參數(shù)傳遞出去。

用戶登出的處理: logout()

注銷
logout: function () {
      this.$cookie.delete("accessToken")
      this.signState = false
      this.$emit("logoutEvent")
    }

清理cookie,觸發(fā)用戶登出事件。

主頁(app)

引入auth組件并注冊為子組件。

import GithubAuth from "@/components/GithubAuth"
Vue.component("auth", GithubAuth)

設置子組件觸發(fā)事件后的處理函數(shù)

methods: {
    login: function (user) {
      this.user = user
    },
    logout: function () {
      this.user = null
    }
  }

初始化一個空的user字段后等待auth喚起事件,改變user字段的值。

data () {
    return {
      user: null
    }
  }
其他組件

因為Vue.js是響應式的,props中設置user字段,初始化時傳入即可。

props: ["user"]
結束語

以上僅是我個人總結出的一些方法,如有更好的解決方法或是錯誤的地方請指出,感激不盡!

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/93576.html

相關文章

  • 基于oauth 2.0 實現(xiàn)三方開放平臺

    摘要:本文單純從簡單的技術實現(xiàn)來講,不涉及開放平臺的多維度的運營理念。它的特點就是通過客戶端的后臺服務器,與服務提供商的認證服務器進行互動能夠滿足絕大多數(shù)開放平臺認證授權的需求。 本文單純從簡單的技術實現(xiàn)來講,不涉及開放平臺的多維度的運營理念。 什么是開放平臺 通過開放自己平臺產(chǎn)品服務的各種API接口,讓其他第三方開發(fā)者在開發(fā)應用時根據(jù)需求直接調(diào)用,例如微信登錄、QQ登錄、微信支付、微博登錄...

    Simon 評論0 收藏0
  • 基于oauth 2.0 實現(xiàn)三方開放平臺

    摘要:本文單純從簡單的技術實現(xiàn)來講,不涉及開放平臺的多維度的運營理念。它的特點就是通過客戶端的后臺服務器,與服務提供商的認證服務器進行互動能夠滿足絕大多數(shù)開放平臺認證授權的需求。 本文單純從簡單的技術實現(xiàn)來講,不涉及開放平臺的多維度的運營理念。 什么是開放平臺 通過開放自己平臺產(chǎn)品服務的各種API接口,讓其他第三方開發(fā)者在開發(fā)應用時根據(jù)需求直接調(diào)用,例如微信登錄、QQ登錄、微信支付、微博登錄...

    xiaodao 評論0 收藏0
  • PHP下Oauth2.0嘗試 - OpenID Connect

    摘要:基礎簡要而言是一種安全機制用于應用連接到身份認證服務器獲取用戶信息并將這些信息以安全可靠的方法返回給應用。這些信息被保存在身份認證服務器以確保特定的客戶端收到的信息只來自于合法的應用平臺。 OpenID Connect OpenID Connect簡介 OpenID Connect是基于OAuth 2.0規(guī)范族的可互操作的身份驗證協(xié)議。它使用簡單的REST / JSON消息流來實現(xiàn),和...

    saucxs 評論0 收藏0
  • Spring Security OAuth2 優(yōu)雅集成短信驗證碼登錄以及三方登錄

    摘要:前言基于做微服務架構分布式系統(tǒng)時,作為認證的業(yè)內(nèi)標準,也提供了全套的解決方案來支持在環(huán)境下使用,提供了開箱即用的組件。 前言 基于SpringCloud做微服務架構分布式系統(tǒng)時,OAuth2.0作為認證的業(yè)內(nèi)標準,Spring Security OAuth2也提供了全套的解決方案來支持在Spring Cloud/Spring Boot環(huán)境下使用OAuth2.0,提供了開箱即用的組件。但...

    yck 評論0 收藏0

發(fā)表評論

0條評論

RancherLabs

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<