在花了几天时间进行一些设计考虑并更好地理解 SecureSocial 之后,我意识到实现find
和save
方法并不难理解。正确设计后端服务中的逻辑很重要。
基本上,我创建了一个PlatformUser
扩展该类的Identity
类,并包含从后端类中提取的用户 ID 和配置文件数据。这是它的外观:
case class PlatformUser(
guid: String,
suspended: Boolean,
id: UserId,
firstName: String,
lastName: String,
fullName: String,
email: Option[String],
avatarUrl: Option[String],
authMethod: AuthenticationMethod,
oAuth1Info: Option[OAuth1Info] = None,
oAuth2Info: Option[OAuth2Info] = None,
passwordInfo: Option[PasswordInfo] = None,
communityProfile: Option[String] = None
) extends Identity
Myobject PlatformUser
包含访问后端 HTTP API 以来回传输数据的代码。以下是我如何实现find
andsave
方法:
def find(id: UserId): Option[PlatformUser] = {
PlatformUser.fetch(id)
}
def findByEmailAndProvider(email: String, providerId: String): Option[PlatformUser] = {
PlatformUser.fetch(email, providerId)
}
def save(user: Identity): PlatformUser = {
PlatformUser.store(user)
}
合并帐户的逻辑也保留在后端服务中。现在,如果用户不存在,后端服务会生成一个平台 ID。如果发现收到的电子邮件Identity
已存在于平台上,则自动将身份链接到现有平台 ID(除非发现该电子邮件正用于同一社交网络的多个帐户,其中错误将被触发)。用户会通过电子邮件收到自动链接的主要地址通知。
剩下的最后一件事是填充communityProfile
. 如果后端服务没有找到,则该字段返回为None
. 然后我自动将用户重定向到他们需要完成个人资料的“注册”页面。
就是这样。我希望这可以帮助那些试图弄清楚 SecureSocial 更复杂用途的未来开发人员。