Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
canifa_note
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Vũ Hoàng Anh
canifa_note
Commits
91296257
Unverified
Commit
91296257
authored
Nov 22, 2023
by
Athurg Gooth
Committed by
GitHub
Nov 22, 2023
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
chore: remove invalid access token from db (#2539)
Remove invalid access token from db
parent
e5f660a0
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
47 additions
and
25 deletions
+47
-25
auth.go
api/v1/auth.go
+10
-23
jwt.go
api/v1/jwt.go
+10
-2
user_setting.go
store/user_setting.go
+27
-0
No files found.
api/v1/auth.go
View file @
91296257
...
...
@@ -254,33 +254,14 @@ func (s *APIV1Service) SignInSSO(c echo.Context) error {
// @Success 200 {boolean} true "Sign-out success"
// @Router /api/v1/auth/signout [POST]
func
(
s
*
APIV1Service
)
SignOut
(
c
echo
.
Context
)
error
{
ctx
:=
c
.
Request
()
.
Context
()
accessToken
:=
findAccessToken
(
c
)
userID
,
_
:=
getUserIDFromAccessToken
(
accessToken
,
s
.
Secret
)
userAccessTokens
,
err
:=
s
.
Store
.
GetUserAccessTokens
(
ctx
,
userID
)
// Auto remove the current access token from the user access tokens.
if
err
==
nil
&&
len
(
userAccessTokens
)
!=
0
{
accessTokens
:=
[]
*
storepb
.
AccessTokensUserSetting_AccessToken
{}
for
_
,
userAccessToken
:=
range
userAccessTokens
{
if
accessToken
!=
userAccessToken
.
AccessToken
{
accessTokens
=
append
(
accessTokens
,
userAccessToken
)
}
}
if
_
,
err
:=
s
.
Store
.
UpsertUserSettingV1
(
ctx
,
&
storepb
.
UserSetting
{
UserId
:
userID
,
Key
:
storepb
.
UserSettingKey_USER_SETTING_ACCESS_TOKENS
,
Value
:
&
storepb
.
UserSetting_AccessTokens
{
AccessTokens
:
&
storepb
.
AccessTokensUserSetting
{
AccessTokens
:
accessTokens
,
},
},
});
err
!=
nil
{
return
echo
.
NewHTTPError
(
http
.
StatusInternalServerError
,
fmt
.
Sprintf
(
"failed to upsert user setting, err: %s"
,
err
))
.
SetInternal
(
err
)
}
err
:=
removeAccessTokenAndCookies
(
c
,
s
.
Store
,
userID
,
accessToken
)
if
err
!=
nil
{
return
echo
.
NewHTTPError
(
http
.
StatusInternalServerError
,
fmt
.
Sprintf
(
"failed to remove access token, err: %s"
,
err
))
.
SetInternal
(
err
)
}
removeAccessTokenAndCookies
(
c
)
return
c
.
JSON
(
http
.
StatusOK
,
true
)
}
...
...
@@ -393,9 +374,15 @@ func (s *APIV1Service) UpsertAccessTokenToStore(ctx context.Context, user *store
}
// removeAccessTokenAndCookies removes the jwt token from the cookies.
func
removeAccessTokenAndCookies
(
c
echo
.
Context
)
{
func
removeAccessTokenAndCookies
(
c
echo
.
Context
,
s
*
store
.
Store
,
userID
int32
,
token
string
)
error
{
err
:=
s
.
RemoveUserAccessToken
(
c
.
Request
()
.
Context
(),
userID
,
token
)
if
err
!=
nil
{
return
err
}
cookieExp
:=
time
.
Now
()
.
Add
(
-
1
*
time
.
Hour
)
setTokenCookie
(
c
,
auth
.
AccessTokenCookieName
,
""
,
cookieExp
)
return
nil
}
// setTokenCookie sets the token to the cookie.
...
...
api/v1/jwt.go
View file @
91296257
...
...
@@ -8,8 +8,10 @@ import (
"github.com/golang-jwt/jwt/v4"
"github.com/labstack/echo/v4"
"github.com/pkg/errors"
"go.uber.org/zap"
"github.com/usememos/memos/api/auth"
"github.com/usememos/memos/internal/log"
"github.com/usememos/memos/internal/util"
storepb
"github.com/usememos/memos/proto/gen/store"
"github.com/usememos/memos/store"
...
...
@@ -79,7 +81,10 @@ func JWTMiddleware(server *APIV1Service, next echo.HandlerFunc, secret string) e
userID
,
err
:=
getUserIDFromAccessToken
(
accessToken
,
secret
)
if
err
!=
nil
{
removeAccessTokenAndCookies
(
c
)
err
=
removeAccessTokenAndCookies
(
c
,
server
.
Store
,
userID
,
accessToken
)
if
err
!=
nil
{
log
.
Error
(
"fail to remove AccessToken and Cookies"
,
zap
.
Error
(
err
))
}
return
echo
.
NewHTTPError
(
http
.
StatusUnauthorized
,
"Invalid or expired access token"
)
}
...
...
@@ -88,7 +93,10 @@ func JWTMiddleware(server *APIV1Service, next echo.HandlerFunc, secret string) e
return
echo
.
NewHTTPError
(
http
.
StatusInternalServerError
,
"Failed to get user access tokens."
)
.
WithInternal
(
err
)
}
if
!
validateAccessToken
(
accessToken
,
accessTokens
)
{
removeAccessTokenAndCookies
(
c
)
err
=
removeAccessTokenAndCookies
(
c
,
server
.
Store
,
userID
,
accessToken
)
if
err
!=
nil
{
log
.
Error
(
"fail to remove AccessToken and Cookies"
,
zap
.
Error
(
err
))
}
return
echo
.
NewHTTPError
(
http
.
StatusUnauthorized
,
"Invalid access token."
)
}
...
...
store/user_setting.go
View file @
91296257
...
...
@@ -123,3 +123,30 @@ func (s *Store) GetUserAccessTokens(ctx context.Context, userID int32) ([]*store
accessTokensUserSetting
:=
userSetting
.
GetAccessTokens
()
return
accessTokensUserSetting
.
AccessTokens
,
nil
}
// RemoveUserAccessToken remove the access token of the user.
func
(
s
*
Store
)
RemoveUserAccessToken
(
ctx
context
.
Context
,
userID
int32
,
token
string
)
error
{
oldAccessTokens
,
err
:=
s
.
GetUserAccessTokens
(
ctx
,
userID
)
if
err
!=
nil
{
return
err
}
newAccessTokens
:=
make
([]
*
storepb
.
AccessTokensUserSetting_AccessToken
,
0
,
len
(
oldAccessTokens
))
for
_
,
t
:=
range
oldAccessTokens
{
if
token
!=
t
.
AccessToken
{
newAccessTokens
=
append
(
newAccessTokens
,
t
)
}
}
_
,
err
=
s
.
UpsertUserSettingV1
(
ctx
,
&
storepb
.
UserSetting
{
UserId
:
userID
,
Key
:
storepb
.
UserSettingKey_USER_SETTING_ACCESS_TOKENS
,
Value
:
&
storepb
.
UserSetting_AccessTokens
{
AccessTokens
:
&
storepb
.
AccessTokensUserSetting
{
AccessTokens
:
newAccessTokens
,
},
},
})
return
err
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment