Skip to content
Snippets Groups Projects
Commit 4fbc56b0 authored by meskio's avatar meskio :tent:
Browse files

Renew token API

parent 4b22d59f
No related branches found
No related tags found
No related merge requests found
......@@ -35,6 +35,7 @@ func Init(dbPath string, signKey string, r *mux.Router) error {
log.Print(token)
r.HandleFunc("/signin", a.SignIn).Methods("POST")
r.HandleFunc("/token", a.GetToken).Methods("GET")
r.HandleFunc("/member", a.authAdmin(a.ListMembers)).Methods("GET")
r.HandleFunc("/member", a.authAdmin(a.AddMember)).Methods("POST")
......
......@@ -59,6 +59,42 @@ func (a *api) SignIn(w http.ResponseWriter, req *http.Request) {
}
}
func (a *api) GetToken(w http.ResponseWriter, req *http.Request) {
token := req.Header.Get("x-authentication")
ok, claims := a.validateToken(token)
if !ok {
w.WriteHeader(http.StatusUnauthorized)
return
}
num, ok := claims["num"].(float64)
if !ok {
w.WriteHeader(http.StatusUnauthorized)
return
}
role, ok := claims["role"].(string)
if !ok {
w.WriteHeader(http.StatusUnauthorized)
return
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
token, err := a.newToken(int(num), role)
if err != nil {
log.Printf("Can't create a token: %v", err)
w.WriteHeader(http.StatusInternalServerError)
return
}
err = json.NewEncoder(w).Encode(map[string]interface{}{
"token": token,
})
if err != nil {
log.Printf("Can't encode token: %v", err)
w.WriteHeader(http.StatusInternalServerError)
}
}
func (a *api) auth(fn func(http.ResponseWriter, *http.Request)) func(http.ResponseWriter, *http.Request) {
return func(w http.ResponseWriter, req *http.Request) {
token := req.Header.Get("x-authentication")
......
......@@ -8,22 +8,10 @@ import (
func TestSignIn(t *testing.T) {
tapi := newTestAPI(t)
defer tapi.close()
var member struct {
Member
Password string `json:"password"`
}
member.Num = 10
member.Name = "foo"
member.Role = "admin"
member.Password = "password"
resp := tapi.do("POST", "/member", member, nil)
if resp.StatusCode != http.StatusCreated {
t.Fatal("Can't create member:", resp.Status)
}
tapi.addTestMember()
tapi.token = ""
resp = tapi.do("GET", "/member", nil, nil)
resp := tapi.do("GET", "/member", nil, nil)
if resp.StatusCode != http.StatusUnauthorized {
t.Error("Got members without auth")
}
......@@ -33,14 +21,14 @@ func TestSignIn(t *testing.T) {
Member Member `json:"member"`
}
jsonAuth := creds{
Name: member.Name,
Password: member.Password,
Name: testMember.Name,
Password: testMember.Password,
}
resp = tapi.do("POST", "/signin", jsonAuth, &respMember)
if resp.StatusCode != http.StatusOK {
t.Fatal("Can't sign in:", resp.Status)
}
if respMember.Member.Name != member.Name {
if respMember.Member.Name != testMember.Name {
t.Fatal("Unexpected member:", respMember)
}
tapi.token = respMember.Token
......@@ -49,3 +37,23 @@ func TestSignIn(t *testing.T) {
t.Fatal("Can't get members:", resp.Status)
}
}
func TestGetToken(t *testing.T) {
tapi := newTestAPI(t)
defer tapi.close()
tapi.addTestMember()
var body struct {
Token string `json:"token"`
}
resp := tapi.do("GET", "/token", nil, &body)
if resp.StatusCode != http.StatusOK {
t.Fatal("Can't get token:", resp.Status)
}
tapi.token = body.Token
resp = tapi.do("GET", "/member", nil, nil)
if resp.StatusCode != http.StatusOK {
t.Fatal("Can't get members:", resp.Status)
}
}
......@@ -5,11 +5,18 @@ import (
"testing"
)
var testMember = Member{
Num: 10,
Name: "foo",
Email: "foo@example.com",
Balance: 10000,
var testMember = struct {
Member
Password string `json:"password"`
}{
Member: Member{
Num: 10,
Name: "foo",
Email: "foo@example.com",
Role: "admin",
Balance: 10000,
},
Password: "password",
}
func TestMemberAddList(t *testing.T) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment