Board logo

标题: 使用 Play Framework 和 Scala 管理用户身份验证(4)用户管理和身份验证更新 [打印本页]

作者: look_w    时间: 2018-11-18 18:35     标题: 使用 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 方法并开始执行身份验证:
如果在 OAuth1 运行过程的任何时候,对 authenticate                的调用失败,该方法会重定向到索引或用户概况页面来恢复执行。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0