159 lines
3.4 KiB
Go
159 lines
3.4 KiB
Go
|
package osin
|
||
|
|
||
|
import (
|
||
|
"strconv"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
type TestingStorage struct {
|
||
|
clients map[string]Client
|
||
|
authorize map[string]*AuthorizeData
|
||
|
access map[string]*AccessData
|
||
|
refresh map[string]string
|
||
|
}
|
||
|
|
||
|
func NewTestingStorage() *TestingStorage {
|
||
|
r := &TestingStorage{
|
||
|
clients: make(map[string]Client),
|
||
|
authorize: make(map[string]*AuthorizeData),
|
||
|
access: make(map[string]*AccessData),
|
||
|
refresh: make(map[string]string),
|
||
|
}
|
||
|
|
||
|
r.clients["1234"] = &DefaultClient{
|
||
|
Id: "1234",
|
||
|
Secret: "aabbccdd",
|
||
|
RedirectUri: "http://localhost:14000/appauth",
|
||
|
}
|
||
|
|
||
|
r.clients["public-client"] = &DefaultClient{
|
||
|
Id: "public-client",
|
||
|
RedirectUri: "http://localhost:14000/appauth",
|
||
|
}
|
||
|
|
||
|
r.authorize["9999"] = &AuthorizeData{
|
||
|
Client: r.clients["1234"],
|
||
|
Code: "9999",
|
||
|
ExpiresIn: 3600,
|
||
|
CreatedAt: time.Now(),
|
||
|
RedirectUri: "http://localhost:14000/appauth",
|
||
|
}
|
||
|
|
||
|
r.access["9999"] = &AccessData{
|
||
|
Client: r.clients["1234"],
|
||
|
AuthorizeData: r.authorize["9999"],
|
||
|
AccessToken: "9999",
|
||
|
ExpiresIn: 3600,
|
||
|
CreatedAt: time.Now(),
|
||
|
}
|
||
|
|
||
|
r.access["r9999"] = &AccessData{
|
||
|
Client: r.clients["1234"],
|
||
|
AuthorizeData: r.authorize["9999"],
|
||
|
AccessData: r.access["9999"],
|
||
|
AccessToken: "9999",
|
||
|
RefreshToken: "r9999",
|
||
|
ExpiresIn: 3600,
|
||
|
CreatedAt: time.Now(),
|
||
|
}
|
||
|
|
||
|
r.refresh["r9999"] = "9999"
|
||
|
|
||
|
return r
|
||
|
}
|
||
|
|
||
|
func (s *TestingStorage) Clone() Storage {
|
||
|
return s
|
||
|
}
|
||
|
|
||
|
func (s *TestingStorage) Close() {
|
||
|
}
|
||
|
|
||
|
func (s *TestingStorage) GetClient(id string) (Client, error) {
|
||
|
if c, ok := s.clients[id]; ok {
|
||
|
return c, nil
|
||
|
}
|
||
|
return nil, ErrNotFound
|
||
|
}
|
||
|
|
||
|
func (s *TestingStorage) SetClient(id string, client Client) error {
|
||
|
s.clients[id] = client
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (s *TestingStorage) SaveAuthorize(data *AuthorizeData) error {
|
||
|
s.authorize[data.Code] = data
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (s *TestingStorage) LoadAuthorize(code string) (*AuthorizeData, error) {
|
||
|
if d, ok := s.authorize[code]; ok {
|
||
|
return d, nil
|
||
|
}
|
||
|
return nil, ErrNotFound
|
||
|
}
|
||
|
|
||
|
func (s *TestingStorage) RemoveAuthorize(code string) error {
|
||
|
delete(s.authorize, code)
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (s *TestingStorage) SaveAccess(data *AccessData) error {
|
||
|
s.access[data.AccessToken] = data
|
||
|
if data.RefreshToken != "" {
|
||
|
s.refresh[data.RefreshToken] = data.AccessToken
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (s *TestingStorage) LoadAccess(code string) (*AccessData, error) {
|
||
|
if d, ok := s.access[code]; ok {
|
||
|
return d, nil
|
||
|
}
|
||
|
return nil, ErrNotFound
|
||
|
}
|
||
|
|
||
|
func (s *TestingStorage) RemoveAccess(code string) error {
|
||
|
delete(s.access, code)
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (s *TestingStorage) LoadRefresh(code string) (*AccessData, error) {
|
||
|
if d, ok := s.refresh[code]; ok {
|
||
|
return s.LoadAccess(d)
|
||
|
}
|
||
|
return nil, ErrNotFound
|
||
|
}
|
||
|
|
||
|
func (s *TestingStorage) RemoveRefresh(code string) error {
|
||
|
delete(s.refresh, code)
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// Predictable testing token generation
|
||
|
|
||
|
type TestingAuthorizeTokenGen struct {
|
||
|
counter int64
|
||
|
}
|
||
|
|
||
|
func (a *TestingAuthorizeTokenGen) GenerateAuthorizeToken(data *AuthorizeData) (ret string, err error) {
|
||
|
a.counter++
|
||
|
return strconv.FormatInt(a.counter, 10), nil
|
||
|
}
|
||
|
|
||
|
type TestingAccessTokenGen struct {
|
||
|
acounter int64
|
||
|
rcounter int64
|
||
|
}
|
||
|
|
||
|
func (a *TestingAccessTokenGen) GenerateAccessToken(data *AccessData, generaterefresh bool) (accesstoken string, refreshtoken string, err error) {
|
||
|
a.acounter++
|
||
|
accesstoken = strconv.FormatInt(a.acounter, 10)
|
||
|
|
||
|
if generaterefresh {
|
||
|
a.rcounter++
|
||
|
refreshtoken = "r" + strconv.FormatInt(a.rcounter, 10)
|
||
|
}
|
||
|
return
|
||
|
}
|