ホームページ  >  記事  >  バックエンド開発  >  Gin フレームワークを使用して 2 要素認証機能を実装する

Gin フレームワークを使用して 2 要素認証機能を実装する

PHPz
PHPzオリジナル
2023-06-22 12:45:021102ブラウズ

2 要素認証はネットワーク セキュリティの重要な機能となっており、アカウントのセキュリティを大幅に強化できます。この記事では、Gin フレームワークを使用して 2 要素認証機能を実装する方法を紹介します。

Gin フレームワークは、高性能、使いやすさ、柔軟性という利点を備えた軽量の Web フレームワークです。 RESTful API、ミドルウェア、ルーティング グループ、テンプレート レンダリング、その他の機能をサポートしており、優れたドキュメントとサンプルがあり、最も人気のある Go 言語 Web フレームワークの 1 つとなっています。

開始する前に、Go 言語開発環境がインストールされ、対応する GOPATH および PATH 環境変数が設定されていることを確認してください。

まず、新しい Jin プロジェクトを作成する必要があります。コマンド ラインに次のコマンドを入力します。

$ 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 フレームワークのセッション ミドルウェアで、セッション関連のタスクを処理するために使用されます。
  • uuid は、UUID を生成するために Google によって開発された Go 言語ライブラリです。この記事では、2 要素認証検証コードを生成するために使用されます。

これで、2 要素認証機能の実装を開始できます。

まず、以下に示すように、ログイン ページとログイン リクエストを処理するコードを記述する必要があります。

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 関数を使用して、ユーザーのセッション情報を保存するセッションを保存する Cookie ストアを作成します。ルーターミドルウェア内のセッションミドルウェアを使用し、mysession という名前を付けました。

ホームページのルーティングでは、c.HTML 関数を通じてログイン ページをレンダリングします。ログイン ルートでは、ユーザーが入力したユーザー名とパスワードを取得し、後で実装する関数でそれらを検証します。認証が成功すると、ユーザー名がセッションに保存され、ユーザーは 2 番目の認証ページにリダイレクトされます。

次に、2 番目の認証用のページと関数を記述します。ここでは、Session でログインしたかどうかを確認します。ログインしている場合は、2 次認証ページが表示され、ランダムな 6 桁の確認コードが生成されます。確認コードはセッションに保存され、SMS、電子メール、またはセキュリティ トークンを介してユーザーに送信されます。

// 定义一个中间件,用于检查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 という名前のミドルウェアを定義します。 2 番目のルートでは、ログインしているユーザーがセッション内に見つからない場合、このミドルウェアを使用してユーザーをログイン ページにリダイレクトします。

generateCode という関数を使用して 6 桁の検証コードを生成し、sendCode 関数を使用してその検証コードをユーザーに送信します。実際のアプリケーションでは、この確認コードは SMS、電子メール、またはセキュリティ トークンを使用して送信できます。

POST リクエストと 2 番目のルートのトークンを使用して、ユーザーの 2 次認証コードが正しいかどうかを検証します。認証コードが正しい場合、ユーザーはコントロール パネルのページにリダイレクトされます。

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

49e7d98fbdc4b8d8d7f0875e4d99f3b6
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

0cb96ff5ff1855894865382884e0cb02
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

4367b07332e49defbd081da9afaab4f0
aba7b36f87decd50b18c7e3e3c150106
46d1a6bdc802636878ae98bee68f7971
93f0f5c25f18dab9d176bd4f6de5d30e

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

9c3bca370b5104690d9ef395f2c5f8d1
6c04bd5ca3fcae76e30b72ad730ca86d

<h1>欢迎访问控制面板</h1>

36cc49f0c466276486e50c850b7e4956
73a6ac4ed44ffec12cee46588e518a5e

现在,我们的Gin应用程序就已经完成了。它使用Session中间件实现了用户认证机制,并使用了二次认证功能来增强安全性。

以上がGin フレームワークを使用して 2 要素認証機能を実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。