文档

§Play 中的 OpenID 支持

OpenID 是一种协议,允许用户使用单个帐户访问多个服务。作为 Web 开发人员,您可以使用 OpenID 为用户提供一种使用他们已有的帐户登录的方法,例如他们的 Google 帐户。在企业中,您可能可以使用 OpenID 连接到公司的 SSO 服务器。

§OpenID 流程概述

  1. 用户向您提供他的 OpenID(一个 URL)。
  2. 您的服务器检查 URL 后面的内容以生成一个 URL,您需要将用户重定向到该 URL。
  3. 用户在 OpenID 提供商处确认授权,并被重定向回您的服务器。
  4. 您的服务器从该重定向接收信息,并与提供商核实信息是否正确。

如果所有用户都使用相同的 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 有两个重要功能

如果 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 保护的资源


在此文档中发现错误?此页面的源代码可以在 此处 找到。阅读完 文档指南 后,请随时贡献拉取请求。有疑问或建议要分享?转到 我们的社区论坛 与社区开始对话。