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 次認証コードが正しいかどうかを検証します。認証コードが正しい場合、ユーザーはコントロール パネルのページにリダイレクトされます。
代码已经完成了,现在可以创建一些模板文件来呈现登录、二次验证和控制面板页面了。下面是示例模板文件,你可以根据自身需求对其进行修改。
<meta charset="UTF-8"> <title>Login</title>
<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>
<-- Second-factor.html -->
<meta charset="UTF-8"> <title>Second Factor Authentication</title>
head>
<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>
<meta charset="UTF-8"> <title>Dashboard</title>
<h1>欢迎访问控制面板</h1>
现在,我们的Gin应用程序就已经完成了。它使用Session中间件实现了用户认证机制,并使用了二次认证功能来增强安全性。
以上がGin フレームワークを使用して 2 要素認証機能を実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。