我正在实施一个概念验证网站,可以选择与外部提供商联系。 外部提供程序将用于获取一些其他用户数据。提供者方便地使用OAuth 1.0a公开身份验证。
要获取数据,用户在提供者站点上进行身份验证并授予权限。容易。
该网站使用ServiceStack。用户使用CredentialsAuthProvider
注册和登录。我查看了ServiceStack上的文档,探讨了SocialBoostrapApi演示,并相应地模拟了我的服务;
首先,我添加了一个User
类,它将序列化到我的数据库,以保存其他数据。
然后,我创建了一个CustomUserSession来覆盖OnAuthenticated
方法。
Plugins.Add(new AuthFeature(() => new CustomUserSession(), new IAuthProvider[] {
new CredentialsAuthProvider()
}));
我的OnAuthenticated
方法与SocialBoostrapApi演示中的方法非常相似;它遍历session.ProviderOAuthAccess
并从中获取必要的信息(寻找“ExternalProvider”提供商的OAuthTokens)。
当然,这意味着当用户在外部提供商处授权我的应用时,在OAuth回调中,我会获得accessstoken,secret,everything,并将其放入session.ProviderOAuthAccess
。
这当然适用于当前会话,但如果用户再次注销,则必须再次授权(获取新的访问令牌)。
我需要一些方法将我在会话中输入的数据保存到数据库中;我试着环顾四周但什么都没找到(另见my question here)。
所以,我添加了代码将它们直接保存到DB:
var userOAuthProvider = oauthTokens.TranslateTo<UserOAuthProvider>();
userOAuthProvider.UserAuthId = user.Id;
this.TryResolve<IDbConnectionFactory>().Run(db => db.Save(userOAuthProvider));
现在,当用户进行身份验证时,似乎ServiceStack获取此UserAuthId的所有令牌并将其置于会话中。好!
我是以正确的方式做的吗?
我是否可以删除User
/ CustomUserSession
类,只需在UserOAuthProvider
/ OAuthTokens
的“项目”字典中存储我需要的其他信息?
这会让我的代码更简单..
在OnAuthenticate
结束时,SocialBootstrapApi
再次保存自定义用户表:
authService.TryResolve<IDbConnectionFactory>().Run(db => db.Save(user));
为什么有必要?我想是从User表上的UserOAuthProvider
表中复制一些信息(例如,在新授权后的下次登录时),但为什么呢?该会话似乎已经使用正确的数据进行了初始化。