All checks were successful
ci/woodpecker/push/build Pipeline was successful
Reviewed-on: #8
65 lines
2.0 KiB
Go
65 lines
2.0 KiB
Go
package v1
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
|
|
"gitea.badhouseplants.net/softplayer/softplayer-backend/internal/controllers"
|
|
tokens "gitea.badhouseplants.net/softplayer/softplayer-go-proto/pkg/tokens/v1"
|
|
"google.golang.org/grpc"
|
|
"google.golang.org/grpc/codes"
|
|
"google.golang.org/grpc/metadata"
|
|
"google.golang.org/grpc/status"
|
|
"google.golang.org/protobuf/types/known/emptypb"
|
|
)
|
|
|
|
// var _ tokens.PublicTokensServiceServer = (*PublicTokensServer)(nil)
|
|
|
|
type PublicTokensServer struct {
|
|
tokens.UnimplementedPublicTokensServiceServer
|
|
tokenCtrl *controllers.TokenController
|
|
authorizationCtrl *controllers.AuthController
|
|
}
|
|
|
|
func NewPublicTokensServer(
|
|
tokenCtrl *controllers.TokenController,
|
|
authorizationCtrl *controllers.AuthController,
|
|
) *PublicTokensServer {
|
|
return &PublicTokensServer{
|
|
tokenCtrl: tokenCtrl,
|
|
authorizationCtrl: authorizationCtrl,
|
|
}
|
|
}
|
|
|
|
func (srv *PublicTokensServer) AuthenticateWithToken(ctx context.Context, in *tokens.AuthenticateWithTokenRequest) (*emptypb.Empty, error) {
|
|
tokenAuthRes, err := srv.tokenCtrl.AuthenticateWithToken(ctx, in.TokenValue.Token)
|
|
if err != nil {
|
|
if errors.Is(err, controllers.ErrBadToken) {
|
|
return nil, status.Error(codes.Unauthenticated, "Token is not valid")
|
|
}
|
|
if errors.Is(err, controllers.ErrServerError) {
|
|
return nil, status.Error(codes.Internal, "Something is broken on our side")
|
|
}
|
|
return nil, status.Error(codes.Aborted, "Couldn't list tokens")
|
|
}
|
|
|
|
jwtData := &controllers.JWTData{
|
|
UserID: tokenAuthRes.UserID,
|
|
TokenType: controllers.TokenTypeAccess,
|
|
TokenAud: controllers.TokenAudToken,
|
|
Scope: tokenAuthRes.Scope,
|
|
}
|
|
accessToken, _, err := srv.authorizationCtrl.GenerateToken(jwtData)
|
|
if err != nil {
|
|
return nil, status.Error(codes.Aborted, "Couldn't generate an access token")
|
|
}
|
|
|
|
header := metadata.New(map[string]string{
|
|
"X-Access-Token": accessToken,
|
|
})
|
|
if err := grpc.SetHeader(ctx, header); err != nil {
|
|
return nil, status.Error(codes.Aborted, "Couldn't set metadata")
|
|
}
|
|
return &emptypb.Empty{}, nil
|
|
}
|