首页 > 解决方案 > 如何使用 Go 为 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 &FacebookAuthenticator{}, nil
    }

    return nil, errors.New("invalid provider")
}

您会看到我们选择了正确的提供者并从中返回一个新结构,类似于工厂。问题是我无法完成我的想法,因为我不知道应该为登录响应写什么类型:TryLogin(accessToken string) (WHAT_TYPE_DO_I_NEED_HERE, error)

如果我们facebook作为字符串传递,我们将返回一个新的FacebookAuthenticator. 当我们调用TryLogin它时,它必须检测身份验证器并返回正确的用户响应(FacebookUserResponse、GithubUserResponse 等)

我怎样才能解决这个问题?

标签: gooauth

解决方案


推荐阅读