使用 Play Framework 和 Scala 管理用户身份验证(4)用户管理和身份验证更新
- UID
- 1066743
|
使用 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 的调用失败,该方法会重定向到索引或用户概况页面来恢复执行。 |
|
|
|
|
|