Skip to content

Commit d8ee513

Browse files
committed
feat: update authentication to use http only cookies for token management
1 parent 41d1a5c commit d8ee513

4 files changed

Lines changed: 88 additions & 14 deletions

File tree

app/middlewares/auth_middleware.go

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,38 @@ func (m *Middleware) AuthMiddleware(allowedRole string) domain.MiddlewareFunc {
1717
ctx, span := tracer.Start(request.Context(), "auth middleware")
1818
defer span.End()
1919

20-
token := utils.ExtractBearerToken(request)
21-
if len(*token) < 5 {
22-
ngelog.Error(ctx, "failed to extract bearer token", nil)
23-
utils.Response(domain.HttpResponse{
24-
Code: 401,
25-
Message: "Unauthorized",
26-
Data: nil,
27-
}, writer)
28-
return
29-
}
20+
// token := utils.ExtractBearerToken(request)
21+
// if len(*token) < 5 {
22+
// ngelog.Error(ctx, "failed to extract bearer token", nil)
23+
// utils.Response(domain.HttpResponse{
24+
// Code: 401,
25+
// Message: "Unauthorized",
26+
// Data: nil,
27+
// }, writer)
28+
// return
29+
// }
3030

31+
tokenRaw, err := request.Cookie("token")
32+
if err != nil {
33+
if err == http.ErrNoCookie {
34+
ngelog.Error(ctx, "failed to get token from cookie", nil)
35+
utils.Response(domain.HttpResponse{
36+
Code: 401,
37+
Message: "Unauthorized",
38+
Data: nil,
39+
}, writer)
40+
return
41+
} else {
42+
utils.Response(domain.HttpResponse{
43+
Code: 401,
44+
Message: "Unauthorized",
45+
Data: nil,
46+
}, writer)
47+
return
48+
}
49+
}
50+
token := &tokenRaw.Value
51+
3152
verifyToken, err := m.Jwt.VerifyToken(*token)
3253
if err != nil {
3354
ngelog.Error(ctx, "failed to verify token", err)

app/users/delivery/http/login_users.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ import (
44
"encoding/json"
55
"io"
66
"net/http"
7+
"time"
78

9+
"github.com/hammer-code/lms-be/config"
810
"github.com/hammer-code/lms-be/domain"
911
"github.com/hammer-code/lms-be/utils"
1012
)
@@ -42,6 +44,20 @@ func (h Handler) Login(w http.ResponseWriter, r *http.Request) {
4244
return
4345
}
4446

47+
expiredTime := time.Now().Local().Add(time.Duration(60) * time.Minute)
48+
49+
cookie := http.Cookie{
50+
Name: "token",
51+
Value: token,
52+
Expires: expiredTime,
53+
Path: "/",
54+
HttpOnly: true,
55+
Secure: config.GetConfig().APP_ENV != "development",
56+
}
57+
58+
// Atur cookie pada response writer.
59+
http.SetCookie(w, &cookie)
60+
4561
utils.Response(domain.HttpResponse{
4662
Code: 200,
4763
Message: "Login successfully",

app/users/delivery/http/logout_users.go

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package http
22

33
import (
4+
"net/http"
5+
"time"
6+
7+
"github.com/hammer-code/lms-be/config"
48
"github.com/hammer-code/lms-be/domain"
9+
"github.com/hammer-code/lms-be/pkg/ngelog"
510
"github.com/hammer-code/lms-be/utils"
6-
"net/http"
711
)
812

913
// Logout
@@ -18,14 +22,47 @@ import (
1822
// @Failure 200 {object} domain.HttpResponse
1923
// @Router /api/v1/auth/logout [post]
2024
func (h Handler) Logout(w http.ResponseWriter, r *http.Request) {
21-
token := utils.ExtractBearerToken(r)
25+
// token := utils.ExtractBearerToken(r)
2226

23-
err := h.usecase.Logout(r.Context(), *token)
27+
tokenRaw, err := r.Cookie("token")
28+
if err != nil {
29+
if err == http.ErrNoCookie {
30+
ngelog.Error(r.Context(), "failed to get token from cookie", nil)
31+
utils.Response(domain.HttpResponse{
32+
Code: 401,
33+
Message: "Unauthorized",
34+
Data: nil,
35+
}, w)
36+
return
37+
} else {
38+
utils.Response(domain.HttpResponse{
39+
Code: 401,
40+
Message: "Unauthorized",
41+
Data: nil,
42+
}, w)
43+
return
44+
}
45+
}
46+
token := &tokenRaw.Value
47+
48+
err = h.usecase.Logout(r.Context(), *token)
2449
if err != nil {
2550
resp := utils.CustomErrorResponse(err)
2651
utils.Response(resp, w)
2752
return
2853
}
54+
55+
expiredTime := time.Now().Local().Add(time.Duration(0) * time.Minute)
56+
cookie := http.Cookie{
57+
Name: "token",
58+
Value: "",
59+
Expires: expiredTime,
60+
Path: "/",
61+
HttpOnly: true,
62+
Secure: config.GetConfig().APP_ENV != "development",
63+
}
64+
65+
http.SetCookie(w, &cookie)
2966

3067
utils.Response(domain.HttpResponse{
3168
Code: 200,

config/config.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ func GetConfig() Config {
4848

4949
if c == nil {
5050
// default cors
51-
origins := []string{"*"}
51+
origins := []string{"http://localhost:3000", "https://stg.hammercode.org", "https://hammercode.org"}
5252
methods := []string{"GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"}
5353
headers := []string{"Accept", "Authorization", "Content-Type"}
5454

0 commit comments

Comments
 (0)