首頁 >後端開發 >Golang >使用Beego和OAuth2實現第三方登入

使用Beego和OAuth2實現第三方登入

王林
王林原創
2023-06-22 20:34:371258瀏覽

隨著網路的快速發展,第三方登入已成為網路生活中不可或缺的一部分。第三方登入為使用者提供了更便利、快速、安全的登入方式,相較於傳統的註冊登入方式更加受歡迎。目前市面上的第三方登入主要包括 QQ、微信、微博等大型社群平台。如何快速實現第三方登入的功能呢?本文將介紹如何使用 Beego 和 OAuth2 實作第三方登入功能。

一、Beego 簡介

Beego 是一款開源的、快速的 Go 程式框架。它具有高度的靈活性和可擴展性,並提供了大量的工具和庫。 Beego 能夠幫助開發者快速建立 Web 應用程序,並提供了一些重要的功能,例如自動路由管理、模板系統和靜態文件服務。

二、OAuth2 協議簡介

OAuth2 是一種授權框架協議,可供用戶在不將密碼和其他敏感資訊分享給第三方的同時,授權其他應用程式在其代表用戶存取第三方服務。此協定定義了四種角色:資源擁有者、資源伺服器、用戶端和認證伺服器。其中,資源擁有者是指擁有存取權限的用戶,資源伺服器是指託管資訊資源的伺服器,客戶端是指請求存取受保護資源的軟體程序,認證伺服器是指驗證客戶端身份並授權存取受保護資源的服務。

三、使用Beego 和OAuth2 實作第三方登入

  1. 建立Beego 專案

首先,我們需要建立一個Beego 項目,以便進行本地開發和測試。使用以下命令(需要先安裝Beego):

bee new thirdpartylogin
  1. 安裝必要的庫

我們需要安裝一些必要的庫,包括github.com/astaxie /beegogithub.com/astaxie/beego/orm,可以使用以下命令安裝:

go get github.com/astaxie/beego
go get github.com/astaxie/beego/orm
  1. 建立資料庫

#我們需要建立一個資料庫,以便儲存使用者資訊和第三方登入資訊。可以使用 MySQL 或 PostgreSQL 資料庫。在本文中,我們使用 MySQL 資料庫。以下是建立使用者表和第三方登入表的 SQL 語句:

CREATE TABLE `user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(64) NOT NULL,
  `password` varchar(128) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `oauth` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(11) unsigned NOT NULL,
  `provider` varchar(64) NOT NULL,
  `provider_user_id` varchar(64) NOT NULL,
  `access_token` varchar(128) NOT NULL,
  `refresh_token` varchar(128) NOT NULL,
  `expire_at` int(11) unsigned NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  1. 設定第三方登入

我們需要使用第三方登入進行認證。目前市面上有多種第三方登入方式,包括 QQ、微信、微博等大型社群平台。我們以 QQ 登入為例進行講解。

首先,我們需要在QQ 互聯開放平台(https://connect.qq.com/)註冊一個應用程序,以獲得App IDApp Key。其次,我們需要在Beego 專案中加入如下程式碼,取得使用者授權:

func QQLogin(c *beego.Controller) {
    var state = c.GetString("state")
    var oauth = conf.GetQQOAuthConfig(state)

    authURL := oauth.AuthCodeURL(state)
    c.Redirect(http.StatusTemporaryRedirect, authURL)
} 

在上述程式碼中,state參數用於識別使用者請求,oauth對象包含了QQ 登入所需的設定資訊。我們使用AuthCodeURL方法產生授權位址,並將使用者重新導向至授權頁面。

接著,我們需要加入以下程式碼,接收QQ 回呼請求並取得存取權杖:

func QQLoginCallback(c *beego.Controller) {
    var state = c.GetString("state")
    var code = c.GetString("code")
    var oauth = conf.GetQQOAuthConfig(state)

    token, err := oauth.Exchange(context.TODO(), code)
    if err != nil {
        log.Println(err)
        c.Abort("500")
    }

    data, err := fetchQQUserInfo(token.AccessToken)
    if err != nil {
        log.Println(err)
        c.Abort("500")
    }

    openid := data.GetString("openid")
    if openid == "" {
        log.Println("openid is blank")
        c.Abort("500")
    }

    account := models.GetAccountByProvider("qq", openid)
    if account != nil {
        _ = models.UpdateAccountAccessToken(account, token.AccessToken)
        c.Redirect(http.StatusTemporaryRedirect, "/")
    } else {
        err := models.CreateAccount("qq", openid, token.AccessToken)
        if err != nil {
            log.Println(err)
            c.Abort("500")
        }

        c.Redirect(http.StatusTemporaryRedirect, "/")
    }
}

在上述程式碼中,我們使用Exchange方法取得存取權令牌,使用fetchQQUserInfo方法取得QQ 使用者訊息,其中openid用於唯一標識該QQ 使用者。接著,我們檢查資料庫中是否存在該 QQ 使用者記錄,若存在則更新其存取令牌,否則建立新的帳戶記錄。

  1. 認證授權

最後,我們需要新增認證授權功能,以確保使用者已經通過第三方登入授權。

func AuthRequired(handler http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        sess, err := store.Get(r, "session")
        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }

        if _, ok := sess.Values["user_id"]; !ok {
            w.Header().Set("Location", "/login")
            w.WriteHeader(http.StatusSeeOther)
            return
        }

        handler.ServeHTTP(w, r)
    })
}

在上述程式碼中,我們檢查會話中是否存在使用者 ID,若不存在則會重新導向至登入頁面,否則繼續處理要求。

四、總結

本文介紹如何使用 Beego 和 OAuth2 實現第三方登入。我們使用 QQ 登入作為範例,介紹如何取得使用者授權、取得存取權杖、檢查使用者記錄等功能。使用 Beego 和 OAuth2 實現第三方登入功能,能夠為使用者提供更便利、快速、安全的登入方式,也能為開發者帶來更有效率、更優秀的開發體驗。

以上是使用Beego和OAuth2實現第三方登入的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn