§Play 中的 OpenID 支持
OpenID 是一种协议,允许用户使用单个帐户访问多个服务。作为 Web 开发人员,您可以使用 OpenID 为用户提供一种使用他们已有的帐户登录的方法,例如他们的 Google 帐户。在企业中,您可能可以使用 OpenID 连接到公司的 SSO 服务器。
§OpenID 流程概述
- 用户向您提供他的 OpenID(一个 URL)。
- 您的服务器检查 URL 后面的内容以生成一个 URL,您需要将用户重定向到该 URL。
- 用户在 OpenID 提供商处确认授权,并被重定向回您的服务器。
- 您的服务器从该重定向接收信息,并与提供商核实信息是否正确。
如果所有用户都使用相同的 OpenID 提供商(例如,如果您决定完全依赖 Google 帐户),则可以省略步骤 1。
§用法
要使用 OpenID,首先将 openId
添加到您的 build.sbt
文件中
libraryDependencies ++= Seq(
openId
)
现在,任何想要使用 OpenID 的控制器或组件都必须声明对 OpenIdClient 的依赖关系
import javax.inject.Inject
import scala.concurrent.ExecutionContext
import scala.concurrent.Future
import play.api._
import play.api.data._
import play.api.data.Forms._
import play.api.libs.openid._
import play.api.mvc._
class IdController @Inject() (val openIdClient: OpenIdClient, c: ControllerComponents)(
implicit val ec: ExecutionContext
) extends AbstractController(c)
我们将 OpenIdClient
实例命名为 openIdClient
,以下所有示例都将假设此名称。
§OpenID 在 Play 中
OpenID API 有两个重要功能
OpenIdClient.redirectURL
计算您应该将用户重定向到的 URL。它涉及异步获取用户的 OpenID 页面,这就是它返回Future[String]
的原因。如果 OpenID 无效,则返回的Future
将失败。OpenIdClient.verifiedId
需要一个RequestHeader
并检查它以建立用户信息,包括其经过验证的 OpenID。它将异步调用 OpenID 服务器以检查信息的真实性,返回 UserInfo 的未来。如果信息不正确或服务器检查失败(例如,如果重定向 URL 被伪造),则返回的Future
将失败。
如果 Future
失败,您可以定义一个回退,它将用户重定向回登录页面或返回 BadRequest
。
以下是一个使用示例(来自控制器)
def login = Action {
Ok(views.html.login())
}
def loginPost = Action.async { implicit request =>
Form(
single(
"openid" -> nonEmptyText
)
).bindFromRequest()
.fold(
{ error =>
logger.info(s"bad request ${error.toString}")
Future.successful(BadRequest(error.toString))
},
{ openId =>
openIdClient
.redirectURL(openId, routes.Application.openIdCallback.absoluteURL())
.map(url => Redirect(url))
.recover { case t: Throwable => Redirect(routes.Application.login) }
}
)
}
def openIdCallback = Action.async { implicit request: Request[AnyContent] =>
openIdClient
.verifiedId(request)
.map(info => Ok(info.id + "\n" + info.attributes))
.recover {
case t: Throwable =>
// Here you should look at the error, and give feedback to the user
Redirect(routes.Application.login)
}
}
§扩展属性
用户的 OpenID 提供了他的身份。该协议还支持获取 扩展属性,例如电子邮件地址、名字或姓氏。
您可以从 OpenID 服务器请求可选属性和/或必需属性。请求必需属性意味着如果用户没有提供这些属性,则他无法登录您的服务。
扩展属性在重定向 URL 中请求
openIdClient.redirectURL(
openId,
routes.Application.openIdCallback.absoluteURL(),
Seq("email" -> "http://schema.openid.net/contact/email")
)
然后,属性将在 OpenID 服务器提供的 UserInfo
中可用。
下一步:访问受 OAuth 保护的资源
在此文档中发现错误?此页面的源代码可以在 此处 找到。阅读完 文档指南 后,请随时贡献拉取请求。有疑问或建议要分享?转到 我们的社区论坛 与社区开始对话。