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
5cec1a71
Commit
5cec1a71
authored
Sep 20, 2023
by
Steven
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
chore: update access token generator
parent
ae1e2293
Changes
9
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
135 additions
and
121 deletions
+135
-121
auth.go
api/auth/auth.go
+3
-4
auth.go
api/v1/auth.go
+3
-3
user_service.go
api/v2/user_service.go
+7
-3
user_service.proto
proto/api/v2/user_service.proto
+4
-2
README.md
proto/gen/api/v2/README.md
+2
-1
user_service.pb.go
proto/gen/api/v2/user_service.pb.go
+110
-100
user_service.pb.gw.go
proto/gen/api/v2/user_service.pb.gw.go
+2
-2
CreateAccessTokenDialog.tsx
web/src/components/CreateAccessTokenDialog.tsx
+2
-4
AccessTokenSection.tsx
web/src/components/Settings/AccessTokenSection.tsx
+2
-2
No files found.
api/auth/auth.go
View file @
5cec1a71
...
...
@@ -30,9 +30,8 @@ type ClaimsMessage struct {
}
// GenerateAccessToken generates an access token.
// username is the email of the user.
func
GenerateAccessToken
(
username
string
,
userID
int32
,
expirationTime
time
.
Time
,
secret
string
)
(
string
,
error
)
{
return
generateToken
(
username
,
userID
,
AccessTokenAudienceName
,
expirationTime
,
[]
byte
(
secret
))
func
GenerateAccessToken
(
username
string
,
userID
int32
,
expirationTime
time
.
Time
,
secret
[]
byte
)
(
string
,
error
)
{
return
generateToken
(
username
,
userID
,
AccessTokenAudienceName
,
expirationTime
,
secret
)
}
// generateToken generates a jwt token.
...
...
@@ -43,7 +42,7 @@ func generateToken(username string, userID int32, audience string, expirationTim
IssuedAt
:
jwt
.
NewNumericDate
(
time
.
Now
()),
Subject
:
fmt
.
Sprint
(
userID
),
}
if
expirationTime
.
After
(
time
.
Now
()
)
{
if
!
expirationTime
.
IsZero
(
)
{
registeredClaims
.
ExpiresAt
=
jwt
.
NewNumericDate
(
expirationTime
)
}
...
...
api/v1/auth.go
View file @
5cec1a71
...
...
@@ -104,7 +104,7 @@ func (s *APIV1Service) SignIn(c echo.Context) error {
return
echo
.
NewHTTPError
(
http
.
StatusUnauthorized
,
"Incorrect login credentials, please try again"
)
}
accessToken
,
err
:=
auth
.
GenerateAccessToken
(
user
.
Username
,
user
.
ID
,
time
.
Now
()
.
Add
(
auth
.
AccessTokenDuration
),
s
.
Secret
)
accessToken
,
err
:=
auth
.
GenerateAccessToken
(
user
.
Username
,
user
.
ID
,
time
.
Now
()
.
Add
(
auth
.
AccessTokenDuration
),
[]
byte
(
s
.
Secret
)
)
if
err
!=
nil
{
return
echo
.
NewHTTPError
(
http
.
StatusInternalServerError
,
fmt
.
Sprintf
(
"failed to generate tokens, err: %s"
,
err
))
.
SetInternal
(
err
)
}
...
...
@@ -228,7 +228,7 @@ func (s *APIV1Service) SignInSSO(c echo.Context) error {
return
echo
.
NewHTTPError
(
http
.
StatusForbidden
,
fmt
.
Sprintf
(
"User has been archived with username %s"
,
userInfo
.
Identifier
))
}
accessToken
,
err
:=
auth
.
GenerateAccessToken
(
user
.
Username
,
user
.
ID
,
time
.
Now
()
.
Add
(
auth
.
AccessTokenDuration
),
s
.
Secret
)
accessToken
,
err
:=
auth
.
GenerateAccessToken
(
user
.
Username
,
user
.
ID
,
time
.
Now
()
.
Add
(
auth
.
AccessTokenDuration
),
[]
byte
(
s
.
Secret
)
)
if
err
!=
nil
{
return
echo
.
NewHTTPError
(
http
.
StatusInternalServerError
,
fmt
.
Sprintf
(
"failed to generate tokens, err: %s"
,
err
))
.
SetInternal
(
err
)
}
...
...
@@ -353,7 +353,7 @@ func (s *APIV1Service) SignUp(c echo.Context) error {
if
err
!=
nil
{
return
echo
.
NewHTTPError
(
http
.
StatusInternalServerError
,
"Failed to create user"
)
.
SetInternal
(
err
)
}
accessToken
,
err
:=
auth
.
GenerateAccessToken
(
user
.
Username
,
user
.
ID
,
time
.
Now
()
.
Add
(
auth
.
AccessTokenDuration
),
s
.
Secret
)
accessToken
,
err
:=
auth
.
GenerateAccessToken
(
user
.
Username
,
user
.
ID
,
time
.
Now
()
.
Add
(
auth
.
AccessTokenDuration
),
[]
byte
(
s
.
Secret
)
)
if
err
!=
nil
{
return
echo
.
NewHTTPError
(
http
.
StatusInternalServerError
,
fmt
.
Sprintf
(
"failed to generate tokens, err: %s"
,
err
))
.
SetInternal
(
err
)
}
...
...
api/v2/user_service.go
View file @
5cec1a71
...
...
@@ -177,7 +177,11 @@ func (s *UserService) CreateUserAccessToken(ctx context.Context, request *apiv2p
return
nil
,
status
.
Errorf
(
codes
.
Internal
,
"failed to get current user: %v"
,
err
)
}
accessToken
,
err
:=
auth
.
GenerateAccessToken
(
user
.
Username
,
user
.
ID
,
request
.
UserAccessToken
.
ExpiresAt
.
AsTime
(),
s
.
Secret
)
expiresAt
:=
time
.
Time
{}
if
request
.
ExpiresAt
!=
nil
{
expiresAt
=
request
.
ExpiresAt
.
AsTime
()
}
accessToken
,
err
:=
auth
.
GenerateAccessToken
(
user
.
Username
,
user
.
ID
,
expiresAt
,
[]
byte
(
s
.
Secret
))
if
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
Internal
,
"failed to generate access token: %v"
,
err
)
}
...
...
@@ -199,13 +203,13 @@ func (s *UserService) CreateUserAccessToken(ctx context.Context, request *apiv2p
}
// Upsert the access token to user setting store.
if
err
:=
s
.
UpsertAccessTokenToStore
(
ctx
,
user
,
accessToken
,
request
.
UserAccessToken
.
Description
);
err
!=
nil
{
if
err
:=
s
.
UpsertAccessTokenToStore
(
ctx
,
user
,
accessToken
,
request
.
Description
);
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
Internal
,
"failed to upsert access token to store: %v"
,
err
)
}
userAccessToken
:=
&
apiv2pb
.
UserAccessToken
{
AccessToken
:
accessToken
,
Description
:
request
.
UserAccessToken
.
Description
,
Description
:
request
.
Description
,
IssuedAt
:
timestamppb
.
New
(
claims
.
IssuedAt
.
Time
),
}
if
claims
.
ExpiresAt
!=
nil
{
...
...
proto/api/v2/user_service.proto
View file @
5cec1a71
...
...
@@ -31,7 +31,7 @@ service UserService {
rpc
CreateUserAccessToken
(
CreateUserAccessTokenRequest
)
returns
(
CreateUserAccessTokenResponse
)
{
option
(
google.api.http
)
=
{
post
:
"/api/v2/users/{username}/access_tokens"
body
:
"
user_access_token
"
body
:
"
*
"
};
option
(
google.api.method_signature
)
=
"username"
;
}
...
...
@@ -102,7 +102,9 @@ message ListUserAccessTokensResponse {
message
CreateUserAccessTokenRequest
{
string
username
=
1
;
UserAccessToken
user_access_token
=
2
;
string
description
=
2
;
optional
google.protobuf.Timestamp
expires_at
=
3
;
}
message
CreateUserAccessTokenResponse
{
...
...
proto/gen/api/v2/README.md
View file @
5cec1a71
...
...
@@ -480,7 +480,8 @@
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| username |
[
string
](
#string
)
| | |
| user_access_token |
[
UserAccessToken
](
#memos-api-v2-UserAccessToken
)
| | |
| description |
[
string
](
#string
)
| | |
| expires_at |
[
google.protobuf.Timestamp
](
#google-protobuf-Timestamp
)
| optional | |
...
...
proto/gen/api/v2/user_service.pb.go
View file @
5cec1a71
This diff is collapsed.
Click to expand it.
proto/gen/api/v2/user_service.pb.gw.go
View file @
5cec1a71
...
...
@@ -211,7 +211,7 @@ func request_UserService_CreateUserAccessToken_0(ctx context.Context, marshaler
if
berr
!=
nil
{
return
nil
,
metadata
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"%v"
,
berr
)
}
if
err
:=
marshaler
.
NewDecoder
(
newReader
())
.
Decode
(
&
protoReq
.
UserAccessToken
);
err
!=
nil
&&
err
!=
io
.
EOF
{
if
err
:=
marshaler
.
NewDecoder
(
newReader
())
.
Decode
(
&
protoReq
);
err
!=
nil
&&
err
!=
io
.
EOF
{
return
nil
,
metadata
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"%v"
,
err
)
}
...
...
@@ -245,7 +245,7 @@ func local_request_UserService_CreateUserAccessToken_0(ctx context.Context, mars
if
berr
!=
nil
{
return
nil
,
metadata
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"%v"
,
berr
)
}
if
err
:=
marshaler
.
NewDecoder
(
newReader
())
.
Decode
(
&
protoReq
.
UserAccessToken
);
err
!=
nil
&&
err
!=
io
.
EOF
{
if
err
:=
marshaler
.
NewDecoder
(
newReader
())
.
Decode
(
&
protoReq
);
err
!=
nil
&&
err
!=
io
.
EOF
{
return
nil
,
metadata
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"%v"
,
err
)
}
...
...
web/src/components/CreateAccessTokenDialog.tsx
View file @
5cec1a71
...
...
@@ -70,10 +70,8 @@ const CreateAccessTokenDialog: React.FC<Props> = (props: Props) => {
try
{
await
userServiceClient
.
createUserAccessToken
({
username
:
currentUser
.
username
,
userAccessToken
:
{
description
:
state
.
description
,
expiresAt
:
new
Date
(
Date
.
now
()
+
state
.
expiration
*
1000
),
},
description
:
state
.
description
,
expiresAt
:
state
.
expiration
?
new
Date
(
Date
.
now
()
+
state
.
expiration
*
1000
)
:
undefined
,
});
onConfirm
();
...
...
web/src/components/Settings/AccessTokenSection.tsx
View file @
5cec1a71
...
...
@@ -119,10 +119,10 @@ const AccessTokenSection = () => {
{
userAccessToken
.
description
}
</
td
>
<
td
className=
"whitespace-nowrap px-3 py-4 text-sm text-gray-500 dark:text-gray-400"
>
{
String
(
userAccessToken
.
issuedAt
)
}
{
userAccessToken
.
issuedAt
?.
toLocaleString
(
)
}
</
td
>
<
td
className=
"whitespace-nowrap px-3 py-4 text-sm text-gray-500 dark:text-gray-400"
>
{
String
(
userAccessToken
.
expiresAt
??
"Never"
)
}
{
userAccessToken
.
expiresAt
?.
toLocaleString
()
??
"Never"
}
</
td
>
<
td
className=
"relative whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm"
>
<
IconButton
...
...
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