cro*_*ies 2 scala playframework playframework-2.0 securesocial
使用Play!2.0.4和SecureSocial 2(http://securesocial.ws/).Scala实现.这个问题的大部分将直接引用这里的示例:https://github.com/jaliss/securesocial/blob/2.0.12/samples/scala/demo/app/service/InMemoryUserService.scala
我试图找出作者关于后端与存储服务交互的初衷.关于这些def find(id: UserId)和def findByEmailAndProvider(email: String, providerId: String):方法,SecureSocial是否希望提供可用于返回完整SocialUser课程的Facebook ID或电子邮件?
如果是这种情况,那么我们如何为每个用户分配我们自己的ID,以便我们可以将帐户链接在一起?因为似乎如果我将Identity扩展为包含通用ID,那么这也需要重写/扩展社交提供者吗?
至少,我试图弄清楚我应该为后端服务中的方法find和save方法公开哪些API /参数.如果需要澄清这个问题请告诉我:)
在花了几天时间做出一些设计考虑并更好地理解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
Run Code Online (Sandbox Code Playgroud)
我object PlatformUser包含访问后端HTTP API以来回传输数据的代码.以下是我实现find和save方法的方法:
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)
}
Run Code Online (Sandbox Code Playgroud)
合并帐户的逻辑也保留在后端服务中.现在,如果用户尚不存在,则后端服务会生成平台ID.如果Identity发现传入的电子邮件已经存在于平台上,则对现有平台ID执行身份的自动链接(除非发现该电子邮件被用于同一社交网络的多个帐户,其中错误将被触发).通过电子邮件通知用户他们的自动链接的主要地址.
剩下的最后一件事是填充communityProfile.如果后端服务找不到,则该字段返回为None.然后,我会自动将用户重定向到"注册"页面,在那里他们需要完成他们的个人资料.
就是这样.我希望这有助于未来的开发人员试图找出更复杂的SecureSocial用途.