首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 Play Framework 和 Scala 管理用户身份验证(4)用户管理和身份验证更新

使用 Play Framework 和 Scala 管理用户身份验证(4)用户管理和身份验证更新

通过 Twitter 执行身份验证 Twitter OAuth1 身份验证会在以下时刻执行:用户单击登录页面左下角的 Twitter 图标时 ( ) 或经过身份验证的用户从用户概况页面的 Available                authentication providers 部分选择 Twitter(如 图 3 所示)时。
图 3. 概况页面(仅可用于经过身份验证的用户)在两种情况下,该应用程序都将发送一个 /auth/social/:providerId 路由请求,并将                providerId 设置为 twitter 字符串。 清单 21 显示了与该路由关联的                socialAuthenticate 方法。
清单 21. Twitter                身份验证
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def socialAuthenticate(providerId:String) = UserAwareAction.async { implicit request =>
  (socialProviderRegistry.get[SocialProvider](providerId) match {
    case Some(p:SocialProvider with CommonSocialProfileBuilder) => p.authenticate.flatMap {
      case Left(result) => Future.successful(result)
      case Right(authInfo) => for {
        profile <- p.retrieveProfile(authInfo)
        user <- request.identity.fold(userService.save(profile))(userService.link(_,profile))
        authInfo <- authInfoRepository.save(profile.loginInfo, authInfo)
        authenticator <- env.authenticatorService.create(profile.loginInfo)
        value <- env.authenticatorService.init(authenticator)
        result <- env.authenticatorService.embed(value, Redirect(routes.Application.index()))
      } yield result
    }
    case _ => Future.successful(
      Redirect(request.identity.fold(routes.Auth.signIn())(_ => routes.Application.profile()))
        .flashing("error" -> Messages("error.noProvider", providerId))
    )
  }).recover {
    case eroviderException =>
      logger.error("rovider error", e)
      Redirect(request.identity.fold(routes.Auth.signIn())(_ => routes.Application.profile()))
        .flashing("error" -> Messages("error.notAuthenticated", providerId))
  }
}




                请求处理函数是用户感知的。该逻辑基于以下假设:如果请求是匿名的,它就是一个登录操作;否则,该请求从用户概况页面触发并指定一个帐户链接操作。该代码首先确认提供程序                ID 包含在社交服务提供程序注册表中。如果没有,该方法重定向到登录或概况页面,具体取决于请求指定登录还是链接操作。执行此检查后,代码调用提供程序的                authenticate 方法并开始执行身份验证:
  • 第一次完成 authenticate 调用时,它返回一个 Left(result)                    值。这个 result 重定向到执行身份验证流程的外部网站。外部网站完成身份验证时,它通过                    silhouette.conf 中配置的回调 URL 而返回到应用程序。   显示该回调指向与 socialAuthenticate                    方法关联的路由,所以将重新执行该方法。
  • 在重新执行时,socialAuthenticate 再次调用提供程序的                    authenticate 方法,这一次返回一个经过如下处理的                    Right(authInfo) 值:
    • 应用程序向社交服务提供程序请求一个与获得的 authInfo 关联的身份概况。
    • 应用程序检查请求是否是匿名的。如果它是匿名的,则将该操作视为一次登录,并创建或更新一个用户(参见  )。否则,该用户链接帐户,身份概况链接到现有的用户。
    • 该代码保存 authInfo,最后执行   中介绍的 3                            个常见的骤:创建一个身份验证器,初始化它,然后将它嵌入到响应中(重定向到索引页面)。
如果在 OAuth1 运行过程的任何时候,对 authenticate                的调用失败,该方法会重定向到索引或用户概况页面来恢复执行。
返回列表