-
-
Notifications
You must be signed in to change notification settings - Fork 6
/
middleware.go
75 lines (63 loc) · 1.7 KB
/
middleware.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
68
69
70
71
72
73
74
75
package http
import (
"errors"
jwt2 "github.com/firmeve/firmeve/jwt"
"github.com/firmeve/firmeve/kernel"
"github.com/firmeve/firmeve/kernel/contract"
"github.com/gorilla/sessions"
"net/http"
)
func Recovery(ctx contract.Context) {
var logger = ctx.Resolve(`logger`).(contract.Loggable)
defer kernel.RecoverCallback(logger, func(err interface{}, params ...interface{}) {
render(err, ctx)
ctx.Abort()
}, ctx)
ctx.Next()
}
func render(err interface{}, ctx contract.Context) {
message := `Server error`
if v, ok := err.(error); ok {
ctx.Error(http.StatusInternalServerError, v)
} else if v, ok := err.(string); ok {
ctx.Error(http.StatusInternalServerError, kernel.Error(v))
} else {
ctx.Error(http.StatusInternalServerError, kernel.Error(message))
}
}
func Session(ctx contract.Context) {
httpProtocol := ctx.Protocol().(contract.HttpProtocol)
httpProtocol.SetSession(
NewSession(
ctx.Resolve(`http.session.store`).(sessions.Store),
httpProtocol.Request(),
httpProtocol.ResponseWriter(),
),
)
ctx.Next()
}
func Auth(ctx contract.Context) {
httpProtocol := ctx.Protocol().(contract.HttpProtocol)
token := httpProtocol.Header("Authorization")
if token == `` {
ctx.Error(http.StatusUnauthorized, errors.New("unauthorized"))
return
}
jwt := ctx.Resolve(`jwt`).(contract.Jwt)
// token valid
if ok, err := jwt.Valid(token); !ok {
if errors.Is(err, jwt2.ErrorExpired) {
tokenData, _ := jwt.Refresh(token)
token = tokenData.Token
} else {
ctx.Error(http.StatusUnauthorized, err)
return
}
}
// token parse
parse, _ := jwt.Parse(token)
ctx.AddEntity(`uid`, parse.Audience)
ctx.Next()
// response
httpProtocol.ResponseWriter().Header().Set("Authorization", token)
}