Skip to content

Commit

Permalink
added renew access token server implementation logic
Browse files Browse the repository at this point in the history
  • Loading branch information
bruce-mig committed Feb 19, 2024
1 parent 3417679 commit 45f8c10
Showing 1 changed file with 81 additions and 0 deletions.
81 changes: 81 additions & 0 deletions gapi/rpc_renew_access_token.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package gapi

import (
"context"
"errors"
"time"

db "github.com/bruce-mig/simple-bank/db/sqlc"
"github.com/bruce-mig/simple-bank/pb"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
"google.golang.org/protobuf/types/known/timestamppb"
)

func (server *Server) RenewAccessToken(ctx context.Context, req *pb.RenewAccessTokenRequest) (*pb.RenewAccessTokenResponse, error) {
refreshPayload, err := server.tokenMaker.VerifyToken(req.GetRefreshToken())
if err != nil {
return nil, status.Errorf(
codes.Internal,
"failed to verify refresh token",
)
}
session, err := server.store.GetSession(ctx, refreshPayload.ID)
if err != nil {
if errors.Is(err, db.ErrRecordNotFound) {
return nil, status.Errorf(
codes.NotFound,
"user session not found",
)
}
return nil, status.Errorf(
codes.Internal,
"failed to get session",
)
}

if session.IsBlocked {
return nil, status.Errorf(
codes.PermissionDenied,
"blocked session",
)
}

if session.Username != refreshPayload.Username {
return nil, status.Errorf(
codes.PermissionDenied,
"incorrect session user",
)
}

if session.RefreshToken != req.RefreshToken {
return nil, status.Errorf(
codes.Unauthenticated,
"mismatched session token",
)
}

if time.Now().After(session.ExpiresAt) {
return nil, status.Errorf(
codes.Unauthenticated,
"expired session",
)
}

accessToken, accessPayload, err := server.tokenMaker.CreateToken(
refreshPayload.Username,
refreshPayload.Role,
server.config.AccessTokenDuration,
)
if err != nil {
return nil, status.Errorf(
codes.Internal,
"failed to generate access token",
)
}
res := &pb.RenewAccessTokenResponse{
AccessToken: accessToken,
AccessTokenExpiresAt: timestamppb.New(accessPayload.ExpiredAt),
}
return res, nil
}

0 comments on commit 45f8c10

Please sign in to comment.