ホームページ  >  記事  >  バックエンド開発  >  golangにログインする方法

golangにログインする方法

WBOY
WBOYオリジナル
2023-05-19 11:04:37665ブラウズ

Golang へのログイン方法

Golang は、2009 年に Google によって公開されたオープンソース プログラミング言語です。 Golang は、効率性、信頼性、メンテナンスの容易さなどの利点から、バックエンド開発、クラウド コンピューティングなどの分野で広く使用されています。 Golang開発では、ユーザーログインなどの機能を実装する必要があるため、ユーザーログインをどのようにGolangに実装するかが重要な課題となっています。この記事では、Golang でユーザーログインを実装する方法を紹介します。

1. Golang におけるユーザーログインの原理

ユーザーログイン機能を実装するには、ユーザー名やパスワードなどのユーザー情報をサーバー側に保存する必要があります。ユーザーがユーザー名とパスワードを入力すると、サーバーはユーザーの入力を検証する必要があり、一致した場合、サーバーは認証成功情報をユーザーに返し、ユーザーのログイン状態をサーバー側に保存します。ログイン ステータスは Cookie またはセッションの形式で保存できるため、次回ユーザーがアクセスしたときにサーバーがユーザーを識別し、対応するデータを返すことができます。

2. Golang でユーザー ログインを実装する手順

Golang でユーザー ログインを実装するには、次の手順を完了する必要があります:

  1. データベース テーブルを作成する

次に示すように、データベースにユーザー テーブルを作成して、ユーザーのユーザー名、パスワード、その他の情報を保存します。

CREATE TABLE users (
ID int NOT NULL AUTO_INCREMENT,
名前 varchar(20) NOT NULL,
パスワード varchar(50) NOT NULL,
主キー (ID)
);

  1. ログイン ページの書き込み

フロントエンド ページでは、ユーザー名とパスワードの入力ボックスを提供する必要があります。ユーザーがアカウントとパスワードを入力した後、ログイン ボタンをクリックすると、リクエストがサーバーに送信されます。リクエストには、ユーザーが入力したアカウントとパスワードの情報を含める必要があります。

  1. Golang インターフェイスの作成

フロントエンド ページからリクエストを受信した後、サーバーはリクエストを受信して​​処理するための対応するインターフェイスを作成する必要があります。処理手順は次のとおりです。

(1) リクエストに含まれるユーザー名とパスワードの情報を取得します。

(2) データベースに接続し、ユーザーが入力したユーザー名とパスワードを確認します。ユーザー名とパスワードが正常に一致すると、成功した認証情報が返され、見つかったユーザー情報がサーバーに保存されます。

(3) ログインステータス情報をフロントエンドに返します。

  1. ログイン ステータスの保存

Golang では、セッションまたは Cookie メカニズムを通じてユーザーのログイン ステータスを保存できます。セッションはサーバー側に保存される情報であり、Cookieはクライアント側に保存される情報です。ユーザーがログインに成功すると、サーバーはユーザー情報をセッションに保存し、セッション識別情報を Cookie に保存して、次回ユーザーがアクセスしたときにサーバーがユーザーを識別できるようにします。

  1. ユーザー情報のセキュリティ問題

ユーザーのログインプロセス中、ユーザー情報のセキュリティを確保する必要があります。ユーザーのパスワードは暗号化する必要があります。 Golang では、bcrypt アルゴリズムを使用してパスワードを暗号化できます。 bcrypt 暗号化アルゴリズムは、複数回にわたってパスワードを繰り返しハッシュする安全なハッシュ アルゴリズムであり、これによりパスワードのセキュリティが強化されます。

3. Golang でのユーザー ログインの実装例

以下は、Golang でユーザー ログインを実装する方法を示す簡単な例です。

  1. ユーザー テーブルの作成

MySQL で次の SQL ステートメントを実行します:

CREATE TABLE users (
ID int NOT NULL AUTO_INCREMENT,
名前 varchar(20) NOT NULL,
パスワード varchar(100) NOT NULL,
主キー (ID)
);

  1. ログイン ページの書き込み

HTML ファイルでは、次のコードを記述できます:

8b05045a5be5764f313ed5b9168a17e6
100db36a723c770d327fc0aef2ce13b1
93f0f5c25f18dab9d176bd4f6de5d30e

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

< ;/ head>
6c04bd5ca3fcae76e30b72ad730ca86d

<h1>Login Page</h1>
<form action="/login" method="POST">
  <label for="username">Username:</label>
  <input type="text" id="username" name="username" /><br />
  <label for="password">Password:</label>
  <input type="password" id="password" name="password" /><br />
  <input type="submit" name="submit" value="Login" />
</form>

36cc49f0c466276486e50c850b7e4956
73a6ac4ed44ffec12cee46588e518a5e

  1. Golang コードの作成

Golang コードは次のとおりです。

package main

import (

"crypto/rand"
"database/sql"
"fmt"
"html/template"
"log"
"net/http"
"strings"
"time"

"golang.org/x/crypto/bcrypt"

_ "github.com/go-sql-driver/mysql"

)

type User struct {

ID       int    `json:"id"`
Name     string `json:"name"`
Password string `json:"password"`

}

var db *sql.DB

func dbSetup() {

var err error
db, err = sql.Open("mysql",
    "username:password@tcp(localhost:3306)/dbname")
if err != nil {
    log.Fatal(err)
}

}

func dbClos​​e() {

db.Close()

}

func UserExists(ユーザー名文字列) bool {

var count int
stmt := "SELECT COUNT(*) FROM users WHERE Name = ?"
row := db.QueryRow(stmt, username)
err := row.Scan(&count)
if err != nil {
    log.Fatal(err)
}
return count > 0

}

func AddUser(user ユーザー) {

stmt := "INSERT INTO users(Name, Password) VALUES(?, ?)"
_, err := db.Exec(stmt, user.Name, user.Password)
if err != nil {
    log.Fatal(err)
}

}

func GetUserByUsername( ユーザー名文字列) (ユーザー、エラー) {

var user User
stmt := "SELECT ID, Name, Password FROM users WHERE Name = ?"
row := db.QueryRow(stmt, username)
err := row.Scan(&user.ID, &user.Name, &user.Password)
switch {
case err == sql.ErrNoRows:
    return User{}, fmt.Errorf("No user with username %s", username)
case err != nil:
    return User{}, err
}
return user, nil

}

func HashPassword(パスワード文字列) (文字列、エラー) {

bytes, err := bcrypt.GenerateFromPassword([]byte(password), 14)
return string(bytes), err

}

func CheckPasswordHash(パスワード, ハッシュ文字列) bool {

err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
return err == nil

}

func LoginHandler(w http.ResponseWriter, r *http.Request) {

if r.Method == "GET" {
    t, _ := template.ParseFiles("login.html")
    t.Execute(w, nil)
} else {
    r.ParseForm()
    username := strings.TrimSpace(r.Form.Get("username"))
    password := strings.TrimSpace(r.Form.Get("password"))

    if !UserExists(username) {
        http.Error(w, "User not found.", http.StatusUnauthorized)
        return
    }

    user, err := GetUserByUsername(username)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    if !CheckPasswordHash(password, user.Password) {
        http.Error(w, "Invalid credentials.", http.StatusUnauthorized)
        return
    }

    sessionID := createSession()
    cookie := &http.Cookie{
        Name:     "sessionid",
        Value:    sessionID,
        Path:     "/",
        Expires:  time.Now().Add(time.Hour * 24 * 7),
        HttpOnly: true,
    }
    http.SetCookie(w, cookie)

    fmt.Fprintf(w, "Welcome, %s!", user.Name)
}

}

func createSession() string {

b := make([]byte, 16)
_, err := rand.Read(b)
if err != nil {
    log.Fatal(err)
}
return fmt.Sprintf("%x", b)

}

func main() {

dbSetup()
defer dbClose()

http.HandleFunc("/login", LoginHandler)

log.Fatal(http.ListenAndServe(":8080", nil))

}

上記のコードはユーザーを実装します。ログイン機能。そのロジックには主に、ユーザーが存在するかどうかの判断、パスワードの検証、セッション ID の生成、Cookie の作成などのステップが含まれます。具体的な実装については、コード内のコメントを参照してください。

4. 概要

Golang でユーザー ログイン機能を実装するには、完了する必要がある主な手順には、ユーザー テーブルの作成、ログイン ページの作成、Golang インターフェイスの作成、ログインの保存が含まれます。ステータスとユーザー情報のセキュリティの確保についての質問です。導入プロセスでは、ユーザー情報のセキュリティに注意を払う必要があります。この記事では、簡単な例を使用して Golang でユーザー ログイン機能を実装する方法を紹介し、読者はこれに基づいて、より複雑な機能を実装することができます。

以上がgolangにログインする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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