go - 如何使用 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 等)
我怎样才能解决这个问题?
解决方案
推荐阅读
- webpack - NextJS 路由器浏览器后退按钮无法正常工作
- python - ModuleNotFoundError:没有名为“baselines.common”的模块
- spring-boot - 无效的直升机名称 Jhipster
- r - 当列条目是按组的最大值时重命名它
- git - 如何真正应用使用 Git diff 创建的补丁?
- datetime - 如果 Amazon Redshift 中的日期差异为负数,则增加 120 分钟
- c++ - 如何从json中提取数字?
- asp.net - System.Data.dll 中出现“System.IndexOutOfRangeException”类型的异常:找不到第 3 列
- jhipster - 为什么在使用 Jhipster 时需要 mapstruct?
- wechat-miniprogram - 如何指定页面的背景颜色?