SHA256
check username
This commit is contained in:
@@ -3,4 +3,4 @@
|
|||||||
|
|
||||||
|
|
||||||
## Credits
|
## Credits
|
||||||
* (Go WebAuthn/Passkey Example)[https://github.com/egregors/go-passkey]
|
* [Go WebAuthn/Passkey Example](https://github.com/egregors/go-passkey)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
module OwOrganizer
|
module OwOrganizer
|
||||||
|
|
||||||
go 1.21.7
|
go 1.24.0
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/go-webauthn/webauthn v0.10.2
|
github.com/go-webauthn/webauthn v0.10.2
|
||||||
@@ -8,7 +8,9 @@ require (
|
|||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
filippo.io/edwards25519 v1.2.0 // indirect
|
||||||
github.com/fxamacker/cbor/v2 v2.6.0 // indirect
|
github.com/fxamacker/cbor/v2 v2.6.0 // indirect
|
||||||
|
github.com/go-sql-driver/mysql v1.10.0 // indirect
|
||||||
github.com/go-webauthn/x v0.1.9 // indirect
|
github.com/go-webauthn/x v0.1.9 // indirect
|
||||||
github.com/golang-jwt/jwt/v5 v5.2.1 // indirect
|
github.com/golang-jwt/jwt/v5 v5.2.1 // indirect
|
||||||
github.com/google/go-tpm v0.9.0 // indirect
|
github.com/google/go-tpm v0.9.0 // indirect
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
|
filippo.io/edwards25519 v1.2.0 h1:crnVqOiS4jqYleHd9vaKZ+HKtHfllngJIiOpNpoJsjo=
|
||||||
|
filippo.io/edwards25519 v1.2.0/go.mod h1:xzAOLCNug/yB62zG1bQ8uziwrIqIuxhctzJT18Q77mc=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/fxamacker/cbor/v2 v2.5.0 h1:oHsG0V/Q6E/wqTS2O1Cozzsy69nqCiguo5Q1a1ADivE=
|
github.com/fxamacker/cbor/v2 v2.5.0 h1:oHsG0V/Q6E/wqTS2O1Cozzsy69nqCiguo5Q1a1ADivE=
|
||||||
github.com/fxamacker/cbor/v2 v2.5.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo=
|
github.com/fxamacker/cbor/v2 v2.5.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo=
|
||||||
github.com/fxamacker/cbor/v2 v2.6.0 h1:sU6J2usfADwWlYDAFhZBQ6TnLFBHxgesMrQfQgk1tWA=
|
github.com/fxamacker/cbor/v2 v2.6.0 h1:sU6J2usfADwWlYDAFhZBQ6TnLFBHxgesMrQfQgk1tWA=
|
||||||
github.com/fxamacker/cbor/v2 v2.6.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
|
github.com/fxamacker/cbor/v2 v2.6.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
|
||||||
|
github.com/go-sql-driver/mysql v1.10.0 h1:Q+1LV8DkHJvSYAdR83XzuhDaTykuDx0l6fkXxoWCWfw=
|
||||||
|
github.com/go-sql-driver/mysql v1.10.0/go.mod h1:M+cqaI7+xxXGG9swrdeUIoPG3Y3KCkF0pZej+SK+nWk=
|
||||||
github.com/go-webauthn/webauthn v0.10.1 h1:+RFKj4yHPy282teiiy5sqTYPfRilzBpJyedrz9KsNFE=
|
github.com/go-webauthn/webauthn v0.10.1 h1:+RFKj4yHPy282teiiy5sqTYPfRilzBpJyedrz9KsNFE=
|
||||||
github.com/go-webauthn/webauthn v0.10.1/go.mod h1:a7BwAtrSMkeuJXtIKz433Av99nAv01pdfzB0a9xkDnI=
|
github.com/go-webauthn/webauthn v0.10.1/go.mod h1:a7BwAtrSMkeuJXtIKz433Av99nAv01pdfzB0a9xkDnI=
|
||||||
github.com/go-webauthn/webauthn v0.10.2 h1:OG7B+DyuTytrEPFmTX503K77fqs3HDK/0Iv+z8UYbq4=
|
github.com/go-webauthn/webauthn v0.10.2 h1:OG7B+DyuTytrEPFmTX503K77fqs3HDK/0Iv+z8UYbq4=
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/go-webauthn/webauthn/webauthn"
|
"github.com/go-webauthn/webauthn/webauthn"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -89,7 +89,7 @@ func BeginRegistration(w http.ResponseWriter, r *http.Request) {
|
|||||||
// can we actually do not use the username at all?
|
// can we actually do not use the username at all?
|
||||||
username, err := getUsername(r)
|
username, err := getUsername(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
l.Printf("[ERRO] can't get user name: %s", err.Error())
|
l.Printf("[ERROR] can't get user name: %s", err.Error())
|
||||||
|
|
||||||
panic(err) // FIXME: handle error
|
panic(err) // FIXME: handle error
|
||||||
}
|
}
|
||||||
@@ -99,7 +99,7 @@ func BeginRegistration(w http.ResponseWriter, r *http.Request) {
|
|||||||
options, session, err := webAuthn.BeginRegistration(user)
|
options, session, err := webAuthn.BeginRegistration(user)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
msg := fmt.Sprintf("can't begin registration: %s", err.Error())
|
msg := fmt.Sprintf("can't begin registration: %s", err.Error())
|
||||||
l.Printf("[ERRO] %s", msg)
|
l.Printf("[ERROR] %s", msg)
|
||||||
JSONResponse(w, msg, http.StatusBadRequest)
|
JSONResponse(w, msg, http.StatusBadRequest)
|
||||||
|
|
||||||
return
|
return
|
||||||
@@ -108,7 +108,7 @@ func BeginRegistration(w http.ResponseWriter, r *http.Request) {
|
|||||||
// Make a session key and store the sessionData values
|
// Make a session key and store the sessionData values
|
||||||
t, err := datastore.GenSessionID()
|
t, err := datastore.GenSessionID()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
l.Printf("[ERRO] can't generate session id: %s", err.Error())
|
l.Printf("[ERROR] can't generate session id: %s", err.Error())
|
||||||
|
|
||||||
panic(err) // FIXME: handle error
|
panic(err) // FIXME: handle error
|
||||||
}
|
}
|
||||||
@@ -133,7 +133,7 @@ func FinishRegistration(w http.ResponseWriter, r *http.Request) {
|
|||||||
// Get the session key from cookie
|
// Get the session key from cookie
|
||||||
sid, err := r.Cookie("sid")
|
sid, err := r.Cookie("sid")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
l.Printf("[ERRO] can't get session id: %s", err.Error())
|
l.Printf("[ERROR] can't get session id: %s", err.Error())
|
||||||
|
|
||||||
panic(err) // FIXME: handle error
|
panic(err) // FIXME: handle error
|
||||||
}
|
}
|
||||||
@@ -141,13 +141,27 @@ func FinishRegistration(w http.ResponseWriter, r *http.Request) {
|
|||||||
// Get the session data stored from the function above
|
// Get the session data stored from the function above
|
||||||
session, _ := datastore.GetSession(sid.Value) // FIXME: cover invalid session
|
session, _ := datastore.GetSession(sid.Value) // FIXME: cover invalid session
|
||||||
|
|
||||||
// In out example username == userID, but in real world it should be different
|
// In our example username == userID, but in real world it should be different
|
||||||
user := datastore.GetOrCreateUser(string(session.UserID)) // Get the user
|
user := datastore.GetOrCreateUser(string(session.UserID)) // Get the user
|
||||||
|
|
||||||
|
var username = strings.Trim(user.WebAuthnName(), " \r\n\t")
|
||||||
|
if username == "" {
|
||||||
|
l.Printf("[ERROR] SaveUser: Empty username")
|
||||||
|
msg := fmt.Sprintf("\"Error\": \"Can't finish registration: Empty username\"")
|
||||||
|
http.SetCookie(w, &http.Cookie{
|
||||||
|
Name: "sid",
|
||||||
|
Value: "",
|
||||||
|
})
|
||||||
|
l.Printf(msg)
|
||||||
|
JSONResponse(w, msg, http.StatusBadRequest)
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
credential, err := webAuthn.FinishRegistration(user, session, r)
|
credential, err := webAuthn.FinishRegistration(user, session, r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
msg := fmt.Sprintf("can't finish registration: %s", err.Error())
|
msg := fmt.Sprintf("can't finish registration: %s", err.Error())
|
||||||
l.Printf("[ERRO] %s", msg)
|
l.Printf("[ERROR] %s", msg)
|
||||||
// clean up sid cookie
|
// clean up sid cookie
|
||||||
http.SetCookie(w, &http.Cookie{
|
http.SetCookie(w, &http.Cookie{
|
||||||
Name: "sid",
|
Name: "sid",
|
||||||
@@ -177,7 +191,7 @@ func BeginLogin(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
username, err := getUsername(r)
|
username, err := getUsername(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
l.Printf("[ERRO]can't get user name: %s", err.Error())
|
l.Printf("[ERROR]can't get user name: %s", err.Error())
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -186,7 +200,7 @@ func BeginLogin(w http.ResponseWriter, r *http.Request) {
|
|||||||
options, session, err := webAuthn.BeginLogin(user)
|
options, session, err := webAuthn.BeginLogin(user)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
msg := fmt.Sprintf("can't begin login: %s", err.Error())
|
msg := fmt.Sprintf("can't begin login: %s", err.Error())
|
||||||
l.Printf("[ERRO] %s", msg)
|
l.Printf("[ERROR] %s", msg)
|
||||||
JSONResponse(w, msg, http.StatusBadRequest)
|
JSONResponse(w, msg, http.StatusBadRequest)
|
||||||
|
|
||||||
return
|
return
|
||||||
@@ -195,7 +209,7 @@ func BeginLogin(w http.ResponseWriter, r *http.Request) {
|
|||||||
// Make a session key and store the sessionData values
|
// Make a session key and store the sessionData values
|
||||||
t, err := datastore.GenSessionID()
|
t, err := datastore.GenSessionID()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
l.Printf("[ERRO] can't generate session id: %s", err.Error())
|
l.Printf("[ERROR] can't generate session id: %s", err.Error())
|
||||||
|
|
||||||
panic(err) // TODO: handle error
|
panic(err) // TODO: handle error
|
||||||
}
|
}
|
||||||
@@ -219,7 +233,7 @@ func FinishLogin(w http.ResponseWriter, r *http.Request) {
|
|||||||
// Get the session key from cookie
|
// Get the session key from cookie
|
||||||
sid, err := r.Cookie("sid")
|
sid, err := r.Cookie("sid")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
l.Printf("[ERRO] can't get session id: %s", err.Error())
|
l.Printf("[ERROR] can't get session id: %s", err.Error())
|
||||||
|
|
||||||
panic(err) // FIXME: handle error
|
panic(err) // FIXME: handle error
|
||||||
}
|
}
|
||||||
@@ -231,7 +245,7 @@ func FinishLogin(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
credential, err := webAuthn.FinishLogin(user, session, r)
|
credential, err := webAuthn.FinishLogin(user, session, r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
l.Printf("[ERRO] can't finish login: %s", err.Error())
|
l.Printf("[ERROR] can't finish login: %s", err.Error())
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -254,7 +268,7 @@ func FinishLogin(w http.ResponseWriter, r *http.Request) {
|
|||||||
// Add the new session cookie
|
// Add the new session cookie
|
||||||
t, err := datastore.GenSessionID()
|
t, err := datastore.GenSessionID()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
l.Printf("[ERRO] can't generate session id: %s", err.Error())
|
l.Printf("[ERROR] can't generate session id: %s", err.Error())
|
||||||
|
|
||||||
panic(err) // TODO: handle error
|
panic(err) // TODO: handle error
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,8 +2,9 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
|
"database/sql"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
|
"github.com/go-sql-driver/mysql"
|
||||||
"github.com/go-webauthn/webauthn/webauthn"
|
"github.com/go-webauthn/webauthn/webauthn"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -67,7 +68,8 @@ func (i *InMem) GetOrCreateUser(userName string) PasskeyUser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (i *InMem) SaveUser(user PasskeyUser) {
|
func (i *InMem) SaveUser(user PasskeyUser) {
|
||||||
|
// Store user in MySQL database
|
||||||
|
|
||||||
i.log.Printf("[DEBUG] SaveUser: %v", user.WebAuthnName())
|
i.log.Printf("[DEBUG] SaveUser: %v", user.WebAuthnName())
|
||||||
i.log.Printf("[DEBUG] SaveUser: %v", user)
|
|
||||||
i.users[user.WebAuthnName()] = user
|
i.users[user.WebAuthnName()] = user
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ async function register() {
|
|||||||
|
|
||||||
|
|
||||||
const msg = await verificationResponse.json();
|
const msg = await verificationResponse.json();
|
||||||
|
console.log(msg);
|
||||||
if (verificationResponse.ok) {
|
if (verificationResponse.ok) {
|
||||||
showMessage(msg, false);
|
showMessage(msg, false);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user