1

marini-go で go-http-auth を使用しようとしています。ここに示す例では、https://github.com/abbot/go-http-auth

package main

import (
        auth "github.com/abbot/go-http-auth"
        "fmt"
        "net/http"
)

func Secret(user, realm string) string {
        if user == "john" {
                // password is "hello"
                return "$1$dlPL2MqE$oQmn16q49SqdmhenQuNgs1"
        }
        return ""
}

func handle(w http.ResponseWriter, r *auth.AuthenticatedRequest) {
        fmt.Fprintf(w, "<html><body><h1>Hello, %s!</h1></body></html>", r.Username)
}


func main() {
    db, err := sql.Open("postgres", "postgres://blabla:blabla@localhost/my_db")
    authenticator := auth.NewBasicAuthenticator("example.com", Secret)
    m := martini.Classic()
    m.Map(db)
    m.Get("/users", authenticator.Wrap(MyUserHandler))
    m.Run()

}

Secret 関数は、ハードコードされたユーザー「john」を使用しています。

実行すると認証成功

curl --user john:hello localhost:3000/users

明らかに、これはハードコードされたユーザー名とパスワードを使用した簡単な例です。

私は今、Secret関数をこれに変更しています

func Secret(user, realm string) string {

    fmt.Println("Executing Secret")

    var db *sql.DB

    var (
        username string
        password string
    )

    err := db.QueryRow("select username, password from users where username = ?", user).Scan(&username, &password)

    if err == sql.ErrNoRows {
        return ""
    }

    if err != nil {
        log.Fatal(err)
    }
    //if user == "john" {
        //// password is "hello"
        //return "$1$dlPL2MqE$oQmn16q49SqdmhenQuNgs1"
    //}
    //return ""
    return ""

}

しかし、関数でPANIC: runtime error: invalid memory address or nil pointer dereference.インスタンス化しようとしているため、Whichで失敗することは明らかです。は に準拠する引数を期待しているため、関数に渡すこともできません。var db *sql.DBSecretdb *sql.DBSecretauth.BasicNewAuthenticationSecrettype func (string, string) string

データベース クエリを正しく実装し、比較のためにパスワードを返すにはどうすればよいですか?

4

2 に答える 2