#go #oauth
#Вперед #oauth
Вопрос:
Я хочу абстрагироваться от логики аутентификации oauth, и я создал следующий код:
provider, _ := utils.ChooseProviderFromString(data.Provider)
user, _ := provider.TryLogin(OAuthAccessToken)
Поставщик поступает в виде строки от клиента (например, facebook, github, google, что угодно). Затем мы передаем его ChooseProviderFromString
методу и возвращаем соответствующую структуру, а затем пытаемся войти в систему.
Пока идея хороша, но все же я застрял.
type OAuthAuthenticator interface {
TryLogin(accessToken string) (WHAT_TYPE_DO_I_NEED_HERE, error)
}
type FacebookAuthenticator struct {
accessToken string
}
func (fbAuth *FacebookAuthenticator) TryLogin(accessToken string) (*FacebookUserResponse, error) {
return GetFacebookUser(accessToken)
}
func ChooseProviderFromString(provider string) (OAuthAuthenticator, error) {
if provider == "facebook" {
return amp;FacebookAuthenticator{}, nil
}
return nil, errors.New("invalid provider")
}
Вы видите, что мы выбираем правильного поставщика и возвращаем из него новую структуру, аналогичную factory . Проблема в том, что я не могу закончить свою идею, поскольку я понятия не имею, какой тип я должен написать для ответа на вход: TryLogin(accessToken string) (WHAT_TYPE_DO_I_NEED_HERE, error)
Если мы передадим facebook
его в виде строки, мы вернем новый FacebookAuthenticator
. Когда мы вызываем TryLogin
, он должен определять аутентификатор и возвращать правильный пользовательский ответ (FacebookUserResponse, GithubUserResponse и т. Д.)
Как я могу это исправить?
Комментарии:
1. На мой взгляд, это полностью зависит от того, как вы хотите использовать результат
TryLogin
, скажем, если вы просто собираетесь передать результат маршалеру json, тогда правильным типом для возврата будетinterface{}
. Если, однако, вам нужно прочитать несколько деталей из возвращаемого значения, то вы могли бы использовать непустой интерфейс или «общий» пользовательский структурный тип, в который аутентификаторы преобразуют свой конкретный результат… Попробуйте обновить свой вопрос подробностями о том, как вам нужно использоватьTryLogin
результат, что «потребитель» кода аутентификации должен делать с результатом.2. Создание пустого интерфейса решило мою проблему, спасибо!