Skip to content

Commit

Permalink
インターフェース名をtokenAuthenticatorからjwtAuthenticatorに変更
Browse files Browse the repository at this point in the history
  • Loading branch information
YutaKakiki authored and YutaKakiki committed Jan 24, 2025
1 parent 80a995c commit c153465
Show file tree
Hide file tree
Showing 18 changed files with 215 additions and 215 deletions.
30 changes: 30 additions & 0 deletions app/adapter/repository/jwt_authenticator_repository.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package repository

import (
"context"

"time"
)

type jwtAuthenticatorRepository struct {
kvsCommander KvsCommander
}

func NewJwtAuthenticatorRepository(kvsCommander KvsCommander) *jwtAuthenticatorRepository {
return &jwtAuthenticatorRepository{
kvsCommander: kvsCommander,
}
}

func (tar *jwtAuthenticatorRepository) Save(ctx context.Context, duration time.Duration, userID, jwtID string) error {
return tar.kvsCommander.Save(ctx, duration, userID, jwtID)
}

// 存在しないKEYを指定した場合は空文字を返す
func (tar *jwtAuthenticatorRepository) Load(ctx context.Context, userID string) (string, error) {
return tar.kvsCommander.Load(ctx, userID)
}

func (tar *jwtAuthenticatorRepository) Delete(ctx context.Context, userID string) error {
return tar.kvsCommander.Delete(ctx, userID)
}
30 changes: 0 additions & 30 deletions app/adapter/repository/token_authenticator_repository.go

This file was deleted.

22 changes: 11 additions & 11 deletions app/application/usecase/auth/authorization_usecase.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,17 @@ import (
)

type AuthorizationUsecase struct {
tokenAuthenticator TokenAuthenticator
tokenAuthenticatorRepository TokenAuthenticatorRepository
jwtAuthenticator JwtAuthenticator
jwtAuthenticatorRepository JwtAuthenticatorRepository
}

func NewAuthorizationUsecase(
tokenAuthenticator TokenAuthenticator,
tokenAuthenticatorRepository TokenAuthenticatorRepository,
jwtAuthenticator JwtAuthenticator,
jwtAuthenticatorRepository JwtAuthenticatorRepository,
) *AuthorizationUsecase {
return &AuthorizationUsecase{
tokenAuthenticator: tokenAuthenticator,
tokenAuthenticatorRepository: tokenAuthenticatorRepository,
jwtAuthenticator: jwtAuthenticator,
jwtAuthenticatorRepository: jwtAuthenticatorRepository,
}
}

Expand All @@ -27,26 +27,26 @@ func (au *AuthorizationUsecase) Run(ctx context.Context, input AuthorizationInpu
) {
// 公開鍵で署名済みトークンを検証する
// 解読されたトークンが返る
token, err := au.tokenAuthenticator.VerifyToken(input.SignedToken)
token, err := au.jwtAuthenticator.VerifyToken(input.SignedToken)
if err != nil {
return nil, err
}
// トークンの有効期限を検証
if err := au.tokenAuthenticator.VerifyExpiresAt(token); err != nil {
if err := au.jwtAuthenticator.VerifyExpiresAt(token); err != nil {
return nil, err
}
// JWT クレームから情報を取得
jti, err := au.tokenAuthenticator.GetJWTIDFromClaim(token)
jti, err := au.jwtAuthenticator.GetJWTIDFromClaim(token)
if err != nil {
return nil, err
}
userID, err := au.tokenAuthenticator.GetSubFromClaim(token)
userID, err := au.jwtAuthenticator.GetSubFromClaim(token)
if err != nil {
return nil, err
}
// KVS から保存された jti を取得
// ログアウトしていた場合は、nilが返る
jtiFromKVS, err := au.tokenAuthenticatorRepository.Load(ctx, userID)
jtiFromKVS, err := au.jwtAuthenticatorRepository.Load(ctx, userID)
if err != nil {
return nil, err
}
Expand Down
10 changes: 5 additions & 5 deletions app/application/usecase/auth/authorization_usecase_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ func TestAuthorizationUsecase_Run(t *testing.T) {
tests := []struct {
name string
input AuthorizationInputDTO
mockFn func(ma *MockTokenAuthenticator, mar *MockTokenAuthenticatorRepository)
mockFn func(ma *MockJwtAuthenticator, mar *MockJwtAuthenticatorRepository)
want *AuthorizationOutputDTO
wantErr bool
}{
Expand All @@ -23,7 +23,7 @@ func TestAuthorizationUsecase_Run(t *testing.T) {
input: AuthorizationInputDTO{
SignedToken: "signedToken",
},
mockFn: func(ma *MockTokenAuthenticator, mar *MockTokenAuthenticatorRepository) {
mockFn: func(ma *MockJwtAuthenticator, mar *MockJwtAuthenticatorRepository) {
ma.EXPECT().VerifyToken(gomock.Any()).Return(&jwt.Token{}, nil)
ma.EXPECT().VerifyExpiresAt(&jwt.Token{}).Return(nil)
ma.EXPECT().GetJWTIDFromClaim(&jwt.Token{}).Return("jti", nil)
Expand All @@ -40,7 +40,7 @@ func TestAuthorizationUsecase_Run(t *testing.T) {
input: AuthorizationInputDTO{
SignedToken: "signedToken",
},
mockFn: func(ma *MockTokenAuthenticator, mar *MockTokenAuthenticatorRepository) {
mockFn: func(ma *MockJwtAuthenticator, mar *MockJwtAuthenticatorRepository) {
ma.EXPECT().VerifyToken(gomock.Any()).Return(&jwt.Token{}, nil)
ma.EXPECT().VerifyExpiresAt(&jwt.Token{}).Return(nil)
ma.EXPECT().GetJWTIDFromClaim(&jwt.Token{}).Return("jti", nil)
Expand All @@ -58,8 +58,8 @@ func TestAuthorizationUsecase_Run(t *testing.T) {
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
ctrl := gomock.NewController(t)
mockAuthenticator := NewMockTokenAuthenticator(ctrl)
mockAuthenticatorRepository := NewMockTokenAuthenticatorRepository(ctrl)
mockAuthenticator := NewMockJwtAuthenticator(ctrl)
mockAuthenticatorRepository := NewMockJwtAuthenticatorRepository(ctrl)
tt.mockFn(mockAuthenticator, mockAuthenticatorRepository)

sut := NewAuthorizationUsecase(mockAuthenticator, mockAuthenticatorRepository)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ import (

// トークンを生成する処理するインターフェース
//
//go:generate mockgen -package=auth -source=./interface_token_authenticator.go -destination=./mock_token_authenticator.go
type TokenAuthenticator interface {
//go:generate mockgen -package=auth -source=./interface_jwt_authenticator.go -destination=./mock_jwt_authenticator.go
type JwtAuthenticator interface {
GenerateToken(sub, jwtID string) *jwt.Token
SignToken(token *jwt.Token) (string, error)
VerifyToken(signedToken string) (*jwt.Token, error)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ import (

// トークンをKVSで操作するリポジトリインターフェース

//go:generate mockgen -package=auth -source=./interface_token_authenticator_repository.go -destination=./mock_token_authenticator_repository.go
type TokenAuthenticatorRepository interface {
//go:generate mockgen -package=auth -source=./interface_jwt_authenticator_repository.go -destination=./mock_jwt_authenticator_repository.go
type JwtAuthenticatorRepository interface {
Save(ctx context.Context, duration time.Duration, userID, jwtID string) error
Load(ctx context.Context, userID string) (string, error)
Delete(ctx context.Context, userID string) error
Expand Down
22 changes: 11 additions & 11 deletions app/application/usecase/auth/login_usecase.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,20 +9,20 @@ import (
)

type LoginUsecase struct {
userRepository user.UserRepository
tokenAuthenticatorRepository TokenAuthenticatorRepository
tokenAuthenticator TokenAuthenticator
userRepository user.UserRepository
jwtAuthenticatorRepository JwtAuthenticatorRepository
jwtAuthenticator JwtAuthenticator
}

func NewLoginUsecase(
userRepository user.UserRepository,
tokenAuthenticatorRepository TokenAuthenticatorRepository,
tokenAuthenticator TokenAuthenticator,
jwtAuthenticatorRepository JwtAuthenticatorRepository,
jwtAuthenticator JwtAuthenticator,
) *LoginUsecase {
return &LoginUsecase{
userRepository: userRepository,
tokenAuthenticatorRepository: tokenAuthenticatorRepository,
tokenAuthenticator: tokenAuthenticator,
userRepository: userRepository,
jwtAuthenticatorRepository: jwtAuthenticatorRepository,
jwtAuthenticator: jwtAuthenticator,
}
}

Expand All @@ -45,13 +45,13 @@ func (lu *LoginUsecase) Run(ctx context.Context, input LoginUsecaseInputDTO) (
}
// トークンを生成
jwtId := ulid.NewUlid() //JWTトークンを識別するID
token := lu.tokenAuthenticator.GenerateToken(u.GetID(), jwtId)
token := lu.jwtAuthenticator.GenerateToken(u.GetID(), jwtId)
// トークンをkvsに保存
if err := lu.tokenAuthenticatorRepository.Save(ctx, time.Duration(24*time.Hour), u.GetID(), jwtId); err != nil {
if err := lu.jwtAuthenticatorRepository.Save(ctx, time.Duration(24*time.Hour), u.GetID(), jwtId); err != nil {
return nil, err
}
// 署名済みトークンを発行
signedToken, err := lu.tokenAuthenticator.SignToken(token)
signedToken, err := lu.jwtAuthenticator.SignToken(token)
if err != nil {
return nil, err
}
Expand Down
10 changes: 5 additions & 5 deletions app/application/usecase/auth/login_usecase_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,14 @@ func TestAuth_LoginUsecase_Run(t *testing.T) {
user1, _ := user.NewUser("[email protected]", "user1", "password")
tests := []struct {
name string
mockFn func(mur *user.MockUserRepository, ma *MockTokenAuthenticator, mar *MockTokenAuthenticatorRepository)
mockFn func(mur *user.MockUserRepository, ma *MockJwtAuthenticator, mar *MockJwtAuthenticatorRepository)
input LoginUsecaseInputDTO
want *LoginUsecaseOutputDTO
wantErr bool
}{
{
name: "正常系:ユーザーにJWTトークンが返る",
mockFn: func(mur *user.MockUserRepository, ma *MockTokenAuthenticator, mar *MockTokenAuthenticatorRepository) {
mockFn: func(mur *user.MockUserRepository, ma *MockJwtAuthenticator, mar *MockJwtAuthenticatorRepository) {
mur.EXPECT().FindByEmail(gomock.Any(), gomock.Any()).Return(user1, nil)
ma.EXPECT().GenerateToken(gomock.Any(), gomock.Any()).Return(&jwt.Token{})
ma.EXPECT().SignToken(gomock.Any()).Return("jwt", nil)
Expand All @@ -39,7 +39,7 @@ func TestAuth_LoginUsecase_Run(t *testing.T) {
},
{
name: "準正常系:パスワードが異なる",
mockFn: func(mur *user.MockUserRepository, ma *MockTokenAuthenticator, mar *MockTokenAuthenticatorRepository) {
mockFn: func(mur *user.MockUserRepository, ma *MockJwtAuthenticator, mar *MockJwtAuthenticatorRepository) {
mur.EXPECT().FindByEmail(gomock.Any(), gomock.Any()).Return(user1, nil)
},
input: LoginUsecaseInputDTO{
Expand All @@ -55,8 +55,8 @@ func TestAuth_LoginUsecase_Run(t *testing.T) {
t.Parallel()
ctrl := gomock.NewController(t)
mockUserRepository := user.NewMockUserRepository(ctrl)
mockAuthenticator := NewMockTokenAuthenticator(ctrl)
mockAuthenticatorRepository := NewMockTokenAuthenticatorRepository(ctrl)
mockAuthenticator := NewMockJwtAuthenticator(ctrl)
mockAuthenticatorRepository := NewMockJwtAuthenticatorRepository(ctrl)
tt.mockFn(mockUserRepository, mockAuthenticator, mockAuthenticatorRepository)
sut := NewLoginUsecase(mockUserRepository, mockAuthenticatorRepository, mockAuthenticator)
ctx := context.Background()
Expand Down
14 changes: 7 additions & 7 deletions app/application/usecase/auth/logout_usecase.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,22 @@ package auth
import "context"

type LogoutUsecase struct {
tokenAuthenticator TokenAuthenticator
tokenAuthenticatorRepository TokenAuthenticatorRepository
jwtAuthenticator JwtAuthenticator
jwtAuthenticatorRepository JwtAuthenticatorRepository
}

func NewLogoutUsecase(
tokenAuthenticator TokenAuthenticator,
tokenAuthenticatorRepository TokenAuthenticatorRepository,
jwtAuthenticator JwtAuthenticator,
jwtAuthenticatorRepository JwtAuthenticatorRepository,
) *LogoutUsecase {
return &LogoutUsecase{
tokenAuthenticator: tokenAuthenticator,
tokenAuthenticatorRepository: tokenAuthenticatorRepository,
jwtAuthenticator: jwtAuthenticator,
jwtAuthenticatorRepository: jwtAuthenticatorRepository,
}
}

func (lu *LogoutUsecase) Run(ctx context.Context, input LogoutUsecaseInputDTO) error {
if err := lu.tokenAuthenticatorRepository.Delete(ctx, input.UserID); err != nil {
if err := lu.jwtAuthenticatorRepository.Delete(ctx, input.UserID); err != nil {
return err
}
return nil
Expand Down
10 changes: 5 additions & 5 deletions app/application/usecase/auth/logout_usecase_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@ import (
func TestLogoutUsecase(t *testing.T) {
tests := []struct {
name string
mockFn func(ma *MockTokenAuthenticator, mar *MockTokenAuthenticatorRepository)
mockFn func(ma *MockJwtAuthenticator, mar *MockJwtAuthenticatorRepository)
input LogoutUsecaseInputDTO
wantErr bool
}{
{
name: "正常系:redisにあるレコードを削除してログアウトする",
mockFn: func(ma *MockTokenAuthenticator, mar *MockTokenAuthenticatorRepository) {
mockFn: func(ma *MockJwtAuthenticator, mar *MockJwtAuthenticatorRepository) {
mar.EXPECT().Delete(gomock.Any(), gomock.Any()).Return(nil)
},
input: LogoutUsecaseInputDTO{
Expand All @@ -27,7 +27,7 @@ func TestLogoutUsecase(t *testing.T) {
},
{
name: "異常系:redis内でエラーが起きた場合、エラーを返す",
mockFn: func(ma *MockTokenAuthenticator, mar *MockTokenAuthenticatorRepository) {
mockFn: func(ma *MockJwtAuthenticator, mar *MockJwtAuthenticatorRepository) {
mar.EXPECT().Delete(gomock.Any(), gomock.Any()).Return(fmt.Errorf("err"))
},
input: LogoutUsecaseInputDTO{
Expand All @@ -41,8 +41,8 @@ func TestLogoutUsecase(t *testing.T) {
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
ctrl := gomock.NewController(t)
mockAuthenticator := NewMockTokenAuthenticator(ctrl)
mockAuthenticatorRepository := NewMockTokenAuthenticatorRepository(ctrl)
mockAuthenticator := NewMockJwtAuthenticator(ctrl)
mockAuthenticatorRepository := NewMockJwtAuthenticatorRepository(ctrl)
tt.mockFn(mockAuthenticator, mockAuthenticatorRepository)
sut := NewLogoutUsecase(mockAuthenticator, mockAuthenticatorRepository)
ctx := context.Background()
Expand Down
Loading

0 comments on commit c153465

Please sign in to comment.