-
Notifications
You must be signed in to change notification settings - Fork 0
/
martini_keycheck.go
67 lines (54 loc) · 1.7 KB
/
martini_keycheck.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package keycheck
import (
"log"
"net/http"
"github.com/go-martini/martini"
)
const (
//AuthFailStatus - failure status code
AuthFailStatus = 403
//AuthSuccessStatus - success status code
AuthSuccessStatus = 200
//KeyLength - valid length of a api-key
KeyLength = 36
)
var (
//AuthFailureResponse - failure response for invalid key
AuthFailureResponse = []byte(`{"error": "no valid key found"}`)
)
type (
//APIKeyCheckHandler - type of our handler function
APIKeyCheckHandler func(log *log.Logger, res http.ResponseWriter, req *http.Request)
)
//NewAPIKeyCheckMiddleware - creates a new instance of our middleware
func NewAPIKeyCheckMiddleware(url string) *APIKeyCheckMiddleware {
keycheck := New(url)
middleware := &APIKeyCheckMiddleware{Keycheck: keycheck}
return middleware
}
//APIKeyCheckMiddleware - our middleware struct
type APIKeyCheckMiddleware struct {
Keycheck KeyChecker
}
func badCheckCall(err error, res *http.Response) bool {
return (err != nil || res.StatusCode != AuthSuccessStatus)
}
//Handler - returns the handler function as a martini.Handler type
func (s *APIKeyCheckMiddleware) Handler() martini.Handler {
var handler APIKeyCheckHandler = func(log *log.Logger, res http.ResponseWriter, req *http.Request) {
if key := req.Header.Get(HeaderKeyName); len(key) == KeyLength {
if kcResponse, err := s.Keycheck.Check(key); badCheckCall(err, kcResponse) {
log.Println("KeyAuth Failed: ", kcResponse, err)
res.WriteHeader(AuthFailStatus)
res.Write(AuthFailureResponse)
} else {
log.Println("KeyAuth Success: ", kcResponse)
}
} else {
log.Println(AuthFailureResponse)
res.WriteHeader(AuthFailStatus)
res.Write(AuthFailureResponse)
}
}
return handler
}