8

我正在实施一个概念验证站点,可以选择与外部提供商链接。外部提供者将用于获取一些额外的用户数据。提供者方便地使用 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吗?这将使我的代码更简单..

第三个问题

在结束时OnAuthenticateSocialBootstrapApi再次保存自定义用户表:

authService.TryResolve<IDbConnectionFactory>().Run(db => db.Save(user));

为什么有必要?我想它是从UserOAuthProvider用户表上的表中复制一些信息(例如,在新授权后的下一次登录时),但为什么呢?会话似乎已经使用正确的数据进行了初始化。

4

0 回答 0