首頁  >  文章  >  後端開發  >  使用Gin框架實現雙因素認證功能

使用Gin框架實現雙因素認證功能

PHPz
PHPz原創
2023-06-22 12:45:021143瀏覽

雙重認證已成為網路安全的必備功能,其可以大大增強帳戶的安全性。在本文中,我們將介紹如何使用Gin框架實現雙因素認證功能。

Gin框架是一個輕量級的Web框架,它具有高效能、易用性和靈活性等優點。它支援RESTful API、中間件、路由群組、模板渲染等功能,並且擁有良好的文件和範例,成為目前很受歡迎的Go語言網路框架之一。

在開始之前,請確保你已經安裝了Go語言開發環境,並且已經設定好了對應的GOPATH和PATH環境變數。

首先,我們需要建立一個新的Gin專案。在命令列中輸入以下命令:

$ mkdir gin-auth
$ cd gin-auth
$ go mod init gin-auth

接下來,我們需要安裝Gin框架和其他依賴套件。在控制台中鍵入以下命令:

$ go get -u github.com/gin-gonic/gin
$ go get -u github.com/gin-contrib/sessions
$ go get -u github.com/google/uuid
  • gin是Gin框架本身。
  • gin-contrib/sessions是Gin框架的Session中介軟體,用於處理Session相關任務。
  • uuid是Google開發的用於產生UUID的Go語言庫。在本文中用於產生二次認證驗證碼。

現在,我們可以開始實現我們的雙因素認證功能了。

我們首先需要寫登入頁面和處理登入要求的程式碼,如下所示:

package main

import (
    "net/http"

    "github.com/gin-contrib/sessions"
    "github.com/gin-gonic/gin"
)

func main() {
    router := gin.Default()

    // 使用sessions中间件
    store := sessions.NewCookieStore([]byte("secret"))
    router.Use(sessions.Sessions("mysession", store))

    router.GET("/", func(c *gin.Context) {
        c.HTML(http.StatusOK, "login.html", nil)
    })

    router.POST("/", func(c *gin.Context) {
        username := c.PostForm("username")
        password := c.PostForm("password")

        // TODO: 验证用户名和密码是否正确

        // 将用户名保存到Session中
        session := sessions.Default(c)
        session.Set("username", username)
        session.Save()

        c.Redirect(http.StatusFound, "/second-factor")
    })

    router.Run(":8080")
}

上面的程式碼中,我們使用Gin框架的gin.Default()函數建立一個基本的路由器。然後,我們使用sessions.NewCookieStore函數建立了一個儲存Session的Cookie Store,用於儲存使用者的Session資訊。我們在路由器中間件中使用了Session中間件,並將其命名為mysession

在首頁路由中,我們透過c.HTML函數將渲染登入頁面。在登入路由中,我們取得使用者輸入的使用者名稱和密碼,然後在稍後實現的功能中驗證它們。如果驗證成功,我們將使用者名稱保存在Session中,並將使用者重新導向到第二種認證頁面。

接下來,我們將撰寫第二次認證的頁面和功能。在這裡,我們透過Session驗證是否已登錄,如果登錄,則顯示二次認證頁面並產生一個隨機的6位數驗證碼。此驗證碼將保存在Session中,並將透過簡訊、郵件或安全性令牌等方式傳送給使用者。

// 定义一个中间件,用于检查Session中是否保存了该用户的用户名
func AuthRequired() gin.HandlerFunc {
    return func(c *gin.Context) {
        session := sessions.Default(c)
        username := session.Get("username")
        if username == nil {
            c.Redirect(http.StatusFound, "/")
            return
        }
        c.Next()
    }
}

func generateCode() string {
    code := uuid.New().String()
    code = strings.ReplaceAll(code, "-", "")
    code = code[:6]
    return code
}

func sendCode(username string, code string) error {
    // TODO: 将验证码发送给用户
    return nil
}

func main() {
    router := gin.Default()

    // ...

    router.GET("/second-factor", AuthRequired(), func(c *gin.Context) {
        session := sessions.Default(c)
        username := session.Get("username").(string)

        code := generateCode()

        // 将二次认证验证码保存到Session
        session.Set("second-factor-code", code)
        session.Save()

        // 发送二次认证验证码
        err := sendCode(username, code)
        if err != nil {
            c.String(http.StatusInternalServerError, "发送二次认证验证码失败")
        }

        // 渲染二次认证视图
        c.HTML(http.StatusOK, "second-factor.html", nil)
    })

    router.POST("/second-factor", AuthRequired(), func(c *gin.Context) {
        session := sessions.Default(c)
        code := session.Get("second-factor-code").(string)
        inputCode := c.PostForm("code")

        // 验证二次认证验证码是否正确
        if code != inputCode {
            c.String(http.StatusBadRequest, "验证码不正确")
            return
        }

        c.Redirect(http.StatusFound, "/dashboard")
    })

    router.Run(":8080")
}

在上面的程式碼中,我們定義了一個名為AuthRequired的中間件,用來檢查Session中是否存在已登入的使用者。在我們的第二個路由中,使用該中間件,如果Session中未找到已登入的用戶,則將用戶重新導向到登入頁面。

我們使用一個名為generateCode的函數來產生6位元數字的驗證碼,並使用sendCode函數將該驗證碼傳送給使用者。在我們的實際應用程式中,可以使用簡訊、郵件或安全性令牌等方式發送該驗證碼。

我們在第二個路由中使用一個POST請求和該令牌來驗證使用者二次認證碼是否正確。如果認證碼正確,則將使用者重新導向至控制面板頁面。

代码已经完成了,现在可以创建一些模板文件来呈现登录、二次验证和控制面板页面了。下面是示例模板文件,你可以根据自身需求对其进行修改。

02fab53d219d289dfbb04d9d45c84f32
aba7b36f87decd50b18c7e3e3c150106
46d1a6bdc802636878ae98bee68f7971
93f0f5c25f18dab9d176bd4f6de5d30e

<meta charset="UTF-8">
<title>Login</title>

9c3bca370b5104690d9ef395f2c5f8d1
6c04bd5ca3fcae76e30b72ad730ca86d

<form method="post" action="/">
  <label>
    用户名:
    <input type="text" name="username" />
  </label>
  <br />
  <label>
    密码:
    <input type="password" name="password" />
  </label>
  <br />
  <button type="submit">登录</button>
</form>

36cc49f0c466276486e50c850b7e4956
73a6ac4ed44ffec12cee46588e518a5e

55fa48996bcb623ea4d16b6c5e0cf545
aba7b36f87decd50b18c7e3e3c150106
46d1a6bdc802636878ae98bee68f7971
93f0f5c25f18dab9d176bd4f6de5d30e

<meta charset="UTF-8">
<title>Second Factor Authentication</title>

3c7b149cc556f883a18b3c490b028d4e
6c04bd5ca3fcae76e30b72ad730ca86d

<form method="post" action="/second-factor">
  <p>
    请验证您的身份。
  </p>
  <p>
    一个6位数字的验证码已经发送到您的邮件或手机上。
    <br />
    请输入该验证码以完成二次认证:
  </p>
  <label>
    验证码:
    <input type="text" name="code" />
  </label>
  <br />
  <button type="submit">验证</button>
</form>

36cc49f0c466276486e50c850b7e4956
73a6ac4ed44ffec12cee46588e518a5e

658817a67e64a475cd8b0397d9e9fb9e




#################################################。 aba7b36f87decd50b18c7e3e3c150106###46d1a6bdc802636878ae98bee68f7971### 93f0f5c25f18dab9d176bd4f6de5d30e###
<meta charset="UTF-8">
<title>Dashboard</title>
###9c3bca370b5104690d9ef395f2c5f8d1### 6c04bd5ca3fcae76e30b72ad730ca86d###
<h1>欢迎访问控制面板</h1>
###36cc49f0c466276486e50c850b7e4956###73a6ac4ed44ffec12cee46588e518a5e###
现在,我们的Gin应用程序就已经完成了。它使用Session中间件实现了用户认证机制,并使用了二次认证功能来增强安全性。

以上是使用Gin框架實現雙因素認證功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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