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.DB
Secret
db *sql.DB
Secret
auth.BasicNewAuthentication
Secret
type func (string, string) string
データベース クエリを正しく実装し、比較のためにパスワードを返すにはどうすればよいですか?