3

使用播放!2.0.4 和 SecureSocial 2 ( http://securesocial.ws/ )。斯卡拉实现。这个问题的大部分将直接引用这里的示例: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和方法公开哪些 API/参数。save让我知道这个问题是否需要澄清:)

4

2 回答 2

7

在花了几天时间进行一些设计考虑并更好地理解 SecureSocial 之后,我意识到实现findsave方法并不难理解。正确设计后端服务中的逻辑很重要。

基本上,我创建了一个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 以来回传输数据的代码。以下是我如何实现findandsave方法:

  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 更复杂用途的未来开发人员。

于 2013-05-05T21:02:10.783 回答
0

“如果发现传入身份的电子邮件已经存在于平台上,则会将身份自动链接到现有的平台 ID”。我假设当您说自动链接时,这将是在登录期间。如果是这样,这将是一个安全漏洞。

恶意用户可以将他的 Twitter 电子邮件设置为您的邮件 ID。当他使用 Twitter 登录时,它会“自动链接”到您的帐户!

请参阅此线程以进行进一步分析https://github.com/jaliss/securesocial/issues/14

于 2014-03-04T05:29:05.970 回答