Как создать общий возвращаемый тип для аутентификации OAuth с помощью Go

#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. Создание пустого интерфейса решило мою проблему, спасибо!