61 lines
1.2 KiB
Go
61 lines
1.2 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"flag"
|
|
"log"
|
|
"net/http"
|
|
|
|
"github.com/julienschmidt/httprouter"
|
|
"github.com/dgrijalva/jwt-go"
|
|
)
|
|
|
|
var listen string
|
|
var secret []byte
|
|
|
|
func main() {
|
|
var s string
|
|
// Parse flags
|
|
flag.StringVar(&listen, "listen", ":8080", "host and port to listen on")
|
|
flag.StringVar(&s, "secret", "secret", "JWT secret")
|
|
flag.Parse()
|
|
|
|
secret = []byte(s)
|
|
|
|
// Routes
|
|
router := httprouter.New()
|
|
|
|
router.POST("/login", Login);
|
|
|
|
// Start server
|
|
log.Printf("starting server on %s", listen)
|
|
log.Fatal(http.ListenAndServe(listen, router))
|
|
}
|
|
|
|
type LoginData struct {
|
|
ID string `json:"id"`
|
|
Client string `json:"client"`
|
|
}
|
|
|
|
func Login(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
|
|
login := LoginData {}
|
|
decoder := json.NewDecoder(r.Body)
|
|
err := decoder.Decode(&login)
|
|
if err != nil {
|
|
http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims {
|
|
"id": login.ID,
|
|
"client": login.Client,
|
|
})
|
|
|
|
tokenString, err := token.SignedString(secret)
|
|
if err != nil {
|
|
http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
|
|
}
|
|
|
|
w.Write([]byte(tokenString))
|
|
}
|