parent
5746a510fc
commit
15ae483fad
@ -0,0 +1,50 @@ |
|||||||
|
package api |
||||||
|
|
||||||
|
import ( |
||||||
|
"errors" |
||||||
|
"net/http" |
||||||
|
) |
||||||
|
|
||||||
|
const ( |
||||||
|
csrfTokenCookieName = "csrf_token" |
||||||
|
csrfTokenHeaderName = "X-CSRF-Token" |
||||||
|
) |
||||||
|
|
||||||
|
func setCSRFMiddleware(h http.Handler) http.Handler { |
||||||
|
return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { |
||||||
|
|
||||||
|
csrfTok, err := getCookie(r, csrfTokenCookieName, "") |
||||||
|
|
||||||
|
if err != nil { |
||||||
|
internalServerError(rw, r, err) |
||||||
|
return |
||||||
|
|
||||||
|
} else if csrfTok == "" { |
||||||
|
http.SetCookie(rw, &http.Cookie{ |
||||||
|
Name: csrfTokenCookieName, |
||||||
|
Value: randStr(32), |
||||||
|
Secure: true, |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
h.ServeHTTP(rw, r) |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
func checkCSRFMiddleware(h http.Handler) http.Handler { |
||||||
|
return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { |
||||||
|
|
||||||
|
csrfTok, err := getCookie(r, csrfTokenCookieName, "") |
||||||
|
|
||||||
|
if err != nil { |
||||||
|
internalServerError(rw, r, err) |
||||||
|
return |
||||||
|
|
||||||
|
} else if csrfTok == "" || r.Header.Get(csrfTokenHeaderName) != csrfTok { |
||||||
|
badRequest(rw, r, errors.New("invalid CSRF token")) |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
h.ServeHTTP(rw, r) |
||||||
|
}) |
||||||
|
} |
@ -0,0 +1,12 @@ |
|||||||
|
const cookies = {}; |
||||||
|
const cookieKVs = document.cookie |
||||||
|
.split(';') |
||||||
|
.map(cookie => cookie.trim().split('=', 2)); |
||||||
|
|
||||||
|
for (const i in cookieKVs) { |
||||||
|
cookies[cookieKVs[i][0]] = cookieKVs[i][1]; |
||||||
|
} |
||||||
|
|
||||||
|
export { |
||||||
|
cookies, |
||||||
|
} |
Loading…
Reference in new issue