summaryrefslogtreecommitdiff
path: root/auth/refresh_middleware.go
blob: 00f73bfa1f0b897951b502b1bfe81c1b5bbd6124 (plain)
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
package auth

import (
	"github.com/golang-jwt/jwt/v4"
	"go.mongodb.org/mongo-driver/bson/primitive"
	"go.mongodb.org/mongo-driver/bson"
	"github.com/MikunoNaka/OpenBills-server/user"
	"github.com/gin-gonic/gin"
	"context"
	"net/http"
)

func verifyRefreshToken() gin.HandlerFunc {
	return func(ctx *gin.Context) {
		refreshToken, err := ctx.Cookie("refreshToken")
		if err == nil {
			token, err := jwt.ParseWithClaims(refreshToken, &jwt.StandardClaims{}, func(token *jwt.Token) (interface{}, error) {
				return []byte(refreshSecret), nil
			})
			if err != nil { // invalid token
				ctx.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"message": "refresh token expired"})
			} else { // valid token
				// convert id from string to ObjectID
	            id, _ := primitive.ObjectIDFromHex(token.Claims.(*jwt.StandardClaims).Issuer)

				// check if user exists
	            var u user.User
	            if err := db.FindOne(context.TODO(), bson.M{"_id": id}).Decode(&u); err != nil {
				    ctx.AbortWithStatusJSON(http.StatusNotFound, gin.H{"message": "user not found"})
	            } else {
					// check if this refreshToken is in DB
					for _, i := range u.Sessions {
						if i.Token == refreshToken {
    			            ctx.Set("user", u)
    			            ctx.Next()
						} else {
				            ctx.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"message": "refresh token expired"})
						}
					}
				}
			}
		} else {
		    // invalid Authorization header
	        ctx.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"message": "not logged in"})
		}
	}
}