我正在实施一个概念验证站点,可以选择与外部提供商链接。外部提供者将用于获取一些额外的用户数据。提供者方便地使用 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 回调中,我得到 accesstoken、secret、所有内容,并将其放入session.ProviderOAuthAccess
.
这当然适用于当前会话,但如果用户注销并再次登录,它必须再次授权(获取新的访问令牌)。
我需要一些方法来将我在会话中放入的数据保存到数据库中;我试图环顾四周,但一无所获(另请参阅我的问题here)。
因此,我添加了代码以将它们直接保存到数据库中:
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));
为什么有必要?我想它是从UserOAuthProvider
用户表上的表中复制一些信息(例如,在新授权后的下一次登录时),但为什么呢?会话似乎已经使用正确的数据进行了初始化。