🎨 Format token package
This commit is contained in:
parent
fafb4bbc94
commit
bb1d908c9a
|
@ -1,8 +1,12 @@
|
|||
package model
|
||||
|
||||
type Profile struct {
|
||||
Name string `json:"name"`
|
||||
URL string `json:"url"`
|
||||
Photo string `json:"photo"`
|
||||
Email string `json:"email,omitempty"`
|
||||
Name string
|
||||
URL URL
|
||||
Photo URL
|
||||
Email string
|
||||
}
|
||||
|
||||
func NewProfile() *Profile {
|
||||
return new(Profile)
|
||||
}
|
||||
|
|
|
@ -1,10 +1,17 @@
|
|||
package model
|
||||
|
||||
type Token struct {
|
||||
AccessToken string
|
||||
ClientID string
|
||||
Me string
|
||||
Profile *Profile
|
||||
Scopes []string
|
||||
AccessToken string
|
||||
Type string
|
||||
Me URL
|
||||
ClientID URL
|
||||
}
|
||||
|
||||
func NewToken() *Token {
|
||||
t := new(Token)
|
||||
t.Scopes = make([]string, 0)
|
||||
|
||||
return t
|
||||
}
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
package model
|
||||
|
||||
type URL string
|
|
@ -5,7 +5,7 @@ import (
|
|||
"strings"
|
||||
|
||||
"github.com/fasthttp/router"
|
||||
"github.com/goccy/go-json"
|
||||
json "github.com/goccy/go-json"
|
||||
http "github.com/valyala/fasthttp"
|
||||
|
||||
"source.toby3d.me/website/oauth/internal/common"
|
||||
|
|
|
@ -3,6 +3,7 @@ package http_test
|
|||
import (
|
||||
"context"
|
||||
"strings"
|
||||
"sync"
|
||||
"testing"
|
||||
|
||||
"github.com/brianvoe/gofakeit"
|
||||
|
@ -24,7 +25,8 @@ func TestVerification(t *testing.T) {
|
|||
|
||||
require := require.New(t)
|
||||
assert := assert.New(t)
|
||||
repo := repository.NewMemoryTokenRepository()
|
||||
store := new(sync.Map)
|
||||
repo := repository.NewMemoryTokenRepository(store)
|
||||
accessToken := model.Token{
|
||||
AccessToken: gofakeit.Password(true, true, true, true, false, 32),
|
||||
Type: "Bearer",
|
||||
|
@ -63,7 +65,8 @@ func TestRevocation(t *testing.T) {
|
|||
|
||||
require := require.New(t)
|
||||
assert := assert.New(t)
|
||||
repo := repository.NewMemoryTokenRepository()
|
||||
store := new(sync.Map)
|
||||
repo := repository.NewMemoryTokenRepository(store)
|
||||
accessToken := gofakeit.Password(true, true, true, true, false, 32)
|
||||
|
||||
require.NoError(repo.Create(context.TODO(), &model.Token{
|
||||
|
|
|
@ -4,6 +4,7 @@ import (
|
|||
"context"
|
||||
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"source.toby3d.me/website/oauth/internal/model"
|
||||
)
|
||||
|
||||
|
@ -15,7 +16,7 @@ type Repository interface {
|
|||
}
|
||||
|
||||
var ErrExist error = model.Error{
|
||||
Code: model.ErrInvalidRequest,
|
||||
Code: "invalid_request",
|
||||
Description: "this token is already exists",
|
||||
Frame: xerrors.Caller(1),
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@ import (
|
|||
"go.etcd.io/bbolt"
|
||||
bolt "go.etcd.io/bbolt"
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"source.toby3d.me/website/oauth/internal/model"
|
||||
"source.toby3d.me/website/oauth/internal/token"
|
||||
)
|
||||
|
@ -44,7 +45,7 @@ func NewBoltTokenRepository(db *bolt.DB) (token.Repository, error) {
|
|||
}
|
||||
|
||||
func (repo *boltTokenRepository) Get(ctx context.Context, accessToken string) (*model.Token, error) {
|
||||
result := new(model.Token)
|
||||
result := model.NewToken()
|
||||
err := repo.db.View(func(tx *bolt.Tx) error {
|
||||
if src := tx.Bucket(Token{}.Bucket()).Get([]byte(accessToken)); src != nil {
|
||||
return NewToken().Bind(src, result)
|
||||
|
@ -104,8 +105,8 @@ func (Token) Bucket() []byte { return []byte("tokens") }
|
|||
|
||||
func (t *Token) Populate(src *model.Token) {
|
||||
t.AccessToken = src.AccessToken
|
||||
t.ClientID = src.ClientID
|
||||
t.Me = src.Me
|
||||
t.ClientID = string(src.ClientID)
|
||||
t.Me = string(src.Me)
|
||||
t.Scope = strings.Join(src.Scopes, " ")
|
||||
t.Type = src.Type
|
||||
}
|
||||
|
@ -116,10 +117,10 @@ func (t *Token) Bind(src []byte, dst *model.Token) error {
|
|||
}
|
||||
|
||||
dst.AccessToken = t.AccessToken
|
||||
dst.ClientID = t.ClientID
|
||||
dst.Me = t.Me
|
||||
dst.Scopes = strings.Fields(t.Scope)
|
||||
dst.Type = t.Type
|
||||
dst.ClientID = model.URL(t.ClientID)
|
||||
dst.Me = model.URL(t.Me)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@ import (
|
|||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"go.etcd.io/bbolt"
|
||||
|
||||
"source.toby3d.me/website/oauth/internal/model"
|
||||
"source.toby3d.me/website/oauth/internal/random"
|
||||
"source.toby3d.me/website/oauth/internal/token"
|
||||
|
@ -81,29 +82,31 @@ func TestGet(t *testing.T) {
|
|||
func TestCreate(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
accessToken := &model.Token{
|
||||
AccessToken: random.New().String(32),
|
||||
accessToken := random.New().String(32)
|
||||
|
||||
t.Cleanup(func() {
|
||||
_ = db.Update(func(tx *bbolt.Tx) error {
|
||||
return tx.Bucket(bolt.Token{}.Bucket()).Delete([]byte(accessToken))
|
||||
})
|
||||
})
|
||||
|
||||
tkn := &model.Token{
|
||||
AccessToken: accessToken,
|
||||
ClientID: "https://app.example.com/",
|
||||
Me: "https://toby3d.me/",
|
||||
Scopes: []string{"read", "update", "delete"},
|
||||
Type: "Bearer",
|
||||
}
|
||||
|
||||
t.Cleanup(func() {
|
||||
_ = db.Update(func(tx *bbolt.Tx) error {
|
||||
return tx.Bucket(bolt.Token{}.Bucket()).Delete([]byte(accessToken.AccessToken))
|
||||
})
|
||||
})
|
||||
require.NoError(t, repo.Create(context.TODO(), tkn))
|
||||
|
||||
require.NoError(t, repo.Create(context.TODO(), accessToken))
|
||||
|
||||
result := new(model.Token)
|
||||
result := model.NewToken()
|
||||
require.NoError(t, db.View(func(tx *bbolt.Tx) error {
|
||||
return bolt.NewToken().Bind(tx.Bucket(bolt.Token{}.Bucket()).Get([]byte(accessToken.AccessToken)), result)
|
||||
return bolt.NewToken().Bind(tx.Bucket(bolt.Token{}.Bucket()).Get([]byte(tkn.AccessToken)), result)
|
||||
}))
|
||||
assert.Equal(t, accessToken, result)
|
||||
assert.Equal(t, tkn, result)
|
||||
|
||||
assert.EqualError(t, repo.Create(context.TODO(), accessToken), token.ErrExist.Error())
|
||||
assert.EqualError(t, repo.Create(context.TODO(), tkn), token.ErrExist.Error())
|
||||
}
|
||||
|
||||
func TestUpdate(t *testing.T) {
|
||||
|
@ -138,7 +141,7 @@ func TestUpdate(t *testing.T) {
|
|||
Type: "Bearer",
|
||||
}))
|
||||
|
||||
result := new(model.Token)
|
||||
result := model.NewToken()
|
||||
require.NoError(t, db.View(func(tx *bbolt.Tx) error {
|
||||
return bolt.NewToken().Bind(tx.Bucket(bolt.Token{}.Bucket()).Get([]byte(accessToken)), result)
|
||||
}))
|
||||
|
|
|
@ -7,6 +7,7 @@ import (
|
|||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"source.toby3d.me/website/oauth/internal/model"
|
||||
"source.toby3d.me/website/oauth/internal/random"
|
||||
"source.toby3d.me/website/oauth/internal/token"
|
||||
|
|
|
@ -7,6 +7,6 @@ import (
|
|||
)
|
||||
|
||||
type UseCase interface {
|
||||
Verify(ctx context.Context, token string) (*model.Token, error)
|
||||
Revoke(ctx context.Context, token string) error
|
||||
Verify(ctx context.Context, accessToken string) (*model.Token, error)
|
||||
Revoke(ctx context.Context, accessToken string) error
|
||||
}
|
||||
|
|
|
@ -17,10 +17,10 @@ func NewTokenUseCase(tokens token.Repository) token.UseCase {
|
|||
}
|
||||
}
|
||||
|
||||
func (useCase *tokenUseCase) Verify(ctx context.Context, token string) (*model.Token, error) {
|
||||
return useCase.tokens.Get(ctx, token)
|
||||
func (useCase *tokenUseCase) Verify(ctx context.Context, accessToken string) (*model.Token, error) {
|
||||
return useCase.tokens.Get(ctx, accessToken)
|
||||
}
|
||||
|
||||
func (useCase *tokenUseCase) Revoke(ctx context.Context, token string) error {
|
||||
return useCase.tokens.Remove(ctx, token)
|
||||
func (useCase *tokenUseCase) Revoke(ctx context.Context, accessToken string) error {
|
||||
return useCase.tokens.Remove(ctx, accessToken)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue