Commit 5cec1a71 authored by Steven's avatar Steven

chore: update access token generator

parent ae1e2293
...@@ -30,9 +30,8 @@ type ClaimsMessage struct { ...@@ -30,9 +30,8 @@ type ClaimsMessage struct {
} }
// GenerateAccessToken generates an access token. // GenerateAccessToken generates an access token.
// username is the email of the user. func GenerateAccessToken(username string, userID int32, expirationTime time.Time, secret []byte) (string, error) {
func GenerateAccessToken(username string, userID int32, expirationTime time.Time, secret string) (string, error) { return generateToken(username, userID, AccessTokenAudienceName, expirationTime, secret)
return generateToken(username, userID, AccessTokenAudienceName, expirationTime, []byte(secret))
} }
// generateToken generates a jwt token. // generateToken generates a jwt token.
...@@ -43,7 +42,7 @@ func generateToken(username string, userID int32, audience string, expirationTim ...@@ -43,7 +42,7 @@ func generateToken(username string, userID int32, audience string, expirationTim
IssuedAt: jwt.NewNumericDate(time.Now()), IssuedAt: jwt.NewNumericDate(time.Now()),
Subject: fmt.Sprint(userID), Subject: fmt.Sprint(userID),
} }
if expirationTime.After(time.Now()) { if !expirationTime.IsZero() {
registeredClaims.ExpiresAt = jwt.NewNumericDate(expirationTime) registeredClaims.ExpiresAt = jwt.NewNumericDate(expirationTime)
} }
......
...@@ -104,7 +104,7 @@ func (s *APIV1Service) SignIn(c echo.Context) error { ...@@ -104,7 +104,7 @@ func (s *APIV1Service) SignIn(c echo.Context) error {
return echo.NewHTTPError(http.StatusUnauthorized, "Incorrect login credentials, please try again") 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 { if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, fmt.Sprintf("failed to generate tokens, err: %s", err)).SetInternal(err) 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 { ...@@ -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)) 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 { if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, fmt.Sprintf("failed to generate tokens, err: %s", err)).SetInternal(err) 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 { ...@@ -353,7 +353,7 @@ func (s *APIV1Service) SignUp(c echo.Context) error {
if err != nil { if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to create user").SetInternal(err) 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 { if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, fmt.Sprintf("failed to generate tokens, err: %s", err)).SetInternal(err) return echo.NewHTTPError(http.StatusInternalServerError, fmt.Sprintf("failed to generate tokens, err: %s", err)).SetInternal(err)
} }
......
...@@ -177,7 +177,11 @@ func (s *UserService) CreateUserAccessToken(ctx context.Context, request *apiv2p ...@@ -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) 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 { if err != nil {
return nil, status.Errorf(codes.Internal, "failed to generate access token: %v", err) 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 ...@@ -199,13 +203,13 @@ func (s *UserService) CreateUserAccessToken(ctx context.Context, request *apiv2p
} }
// Upsert the access token to user setting store. // 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) return nil, status.Errorf(codes.Internal, "failed to upsert access token to store: %v", err)
} }
userAccessToken := &apiv2pb.UserAccessToken{ userAccessToken := &apiv2pb.UserAccessToken{
AccessToken: accessToken, AccessToken: accessToken,
Description: request.UserAccessToken.Description, Description: request.Description,
IssuedAt: timestamppb.New(claims.IssuedAt.Time), IssuedAt: timestamppb.New(claims.IssuedAt.Time),
} }
if claims.ExpiresAt != nil { if claims.ExpiresAt != nil {
......
...@@ -31,7 +31,7 @@ service UserService { ...@@ -31,7 +31,7 @@ service UserService {
rpc CreateUserAccessToken(CreateUserAccessTokenRequest) returns (CreateUserAccessTokenResponse) { rpc CreateUserAccessToken(CreateUserAccessTokenRequest) returns (CreateUserAccessTokenResponse) {
option (google.api.http) = { option (google.api.http) = {
post: "/api/v2/users/{username}/access_tokens" post: "/api/v2/users/{username}/access_tokens"
body: "user_access_token" body: "*"
}; };
option (google.api.method_signature) = "username"; option (google.api.method_signature) = "username";
} }
...@@ -102,7 +102,9 @@ message ListUserAccessTokensResponse { ...@@ -102,7 +102,9 @@ message ListUserAccessTokensResponse {
message CreateUserAccessTokenRequest { message CreateUserAccessTokenRequest {
string username = 1; string username = 1;
UserAccessToken user_access_token = 2; string description = 2;
optional google.protobuf.Timestamp expires_at = 3;
} }
message CreateUserAccessTokenResponse { message CreateUserAccessTokenResponse {
......
...@@ -480,7 +480,8 @@ ...@@ -480,7 +480,8 @@
| Field | Type | Label | Description | | Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- | | ----- | ---- | ----- | ----------- |
| username | [string](#string) | | | | username | [string](#string) | | |
| user_access_token | [UserAccessToken](#memos-api-v2-UserAccessToken) | | | | description | [string](#string) | | |
| expires_at | [google.protobuf.Timestamp](#google-protobuf-Timestamp) | optional | |
......
This diff is collapsed.
...@@ -211,7 +211,7 @@ func request_UserService_CreateUserAccessToken_0(ctx context.Context, marshaler ...@@ -211,7 +211,7 @@ func request_UserService_CreateUserAccessToken_0(ctx context.Context, marshaler
if berr != nil { if berr != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) 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) return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
} }
...@@ -245,7 +245,7 @@ func local_request_UserService_CreateUserAccessToken_0(ctx context.Context, mars ...@@ -245,7 +245,7 @@ func local_request_UserService_CreateUserAccessToken_0(ctx context.Context, mars
if berr != nil { if berr != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) 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) return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
} }
......
...@@ -70,10 +70,8 @@ const CreateAccessTokenDialog: React.FC<Props> = (props: Props) => { ...@@ -70,10 +70,8 @@ const CreateAccessTokenDialog: React.FC<Props> = (props: Props) => {
try { try {
await userServiceClient.createUserAccessToken({ await userServiceClient.createUserAccessToken({
username: currentUser.username, username: currentUser.username,
userAccessToken: { description: state.description,
description: state.description, expiresAt: state.expiration ? new Date(Date.now() + state.expiration * 1000) : undefined,
expiresAt: new Date(Date.now() + state.expiration * 1000),
},
}); });
onConfirm(); onConfirm();
......
...@@ -119,10 +119,10 @@ const AccessTokenSection = () => { ...@@ -119,10 +119,10 @@ const AccessTokenSection = () => {
{userAccessToken.description} {userAccessToken.description}
</td> </td>
<td className="whitespace-nowrap px-3 py-4 text-sm text-gray-500 dark:text-gray-400"> <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>
<td className="whitespace-nowrap px-3 py-4 text-sm text-gray-500 dark:text-gray-400"> <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>
<td className="relative whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm"> <td className="relative whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm">
<IconButton <IconButton
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment