【问题标题】:Auth0 decoupled client-side / server-sideAuth0 解耦客户端/服务器端
【发布时间】:2016-10-22 20:28:33
【问题描述】:

我正在开发一个应用程序,它有一个使用 Play Framework Scala 的服务器端和一个客户端 AngularJS。

我只想在服务器端管理身份验证,因为我必须保护 API 和应用程序本身的安全,并且我希望将会话“集中”在我的服务器上。

但由于我没有使用 Play Framework 视图模板(以保持客户端和服务器端的独立性),因此我无法像示例中那样将用户配置文件信息传递到客户端。

我试图在我的 Angular 模板上列出我的缓存和我的 Cookie 键,但我似乎在那里找不到任何东西。

有什么方法可以使用 Angular 获取会话信息?会话由 Play Framework 请求和管理? (我在文档的任何地方都找不到它)

这是我如何呈现我的 Angular 客户端首页(Play 框架仅执行 API 路由和此首页路由)

  def frontPage() = AuthenticatedAction {
    request =>
      val idToken = request.session.get("idToken").get
      val profile = cache.get[JsValue](idToken + "profile").get
      Ok.sendFile(content = new File("./public/layout.html"), inline = true).as("text/html")
  }

这是在文档示例中的完成方式:

def index = AuthenticatedAction { request =>
  val idToken = request.session.get("idToken").get
  val profile = Cache.getAs[JsValue](idToken + "profile").get
  Ok(views.html.user(profile))
}

我需要将该“配置文件”传递给我的模板,但我不想拥有 scala html 模板:我想继续使用纯 Angular 模板来保持我的客户端/服务器端的独立性(仅通过API)

编辑 21/06/2016:我没有找到直接从 Angular 获取会话信息的方法,但我能够通过扩展我的 API 来返回它,我更喜欢这个解决方案!见https://stackoverflow.com/a/37942787/4884034

【问题讨论】:

    标签: angularjs scala playframework auth0


    【解决方案1】:

    您可以通过以下方式将其渲染到客户端:

    Ok
      .sendFile(content = new File("./public/layout.html"), inline = true).as("text/html")
      .withSession(session)
    

    .withCookies(cookie)

    【讨论】:

    • 所以,我尝试了你的两个选项,第一个选项在我执行 $cookies.getAll() 时仍然在 Angular 上找不到任何东西,因为 withCookies 我得到一个执行异常 Cookie 值包含无效字符:“。withSession 似乎是一个很好的解决方案,但它存储在哪里?
    【解决方案2】:

    所以,感谢@Simon 为我指明了正确的方向。

    我现在在登录后发送会话:

      Ok.sendFile(content = new File("./public/layout.html"), inline = true).as("text/html").withSession("connected" -> profile.toString())
    

    我无法直接从 Angular 获取会话,所以我所做的是更新我的 API 以使操作返回会话信息:

      def getSession = Action { request =>
        request.session.get("connected").map {
          user => Ok(Json.parse(user))
        }.getOrElse {
          Unauthorized("Oops, you are not connected")
        }
      }
    

    (在路线中:

    ## USER SESSION
    GET        /api/session                      controllers.Callback.getSession
    

    )

    这样我可以调用 API 在客户端获取会话信息,可以是 Angular、移动应用程序或任何类型的读取 JSON 的应用程序。

    返回的 JSON 示例:

    {"email":"XXX@XXX.com","email_verified":false,"clientID":"MvM2wHRX2rMKp5s3UXXXXXXXX","updated_at":"2016-06-21T10:59:49.730Z","picture":"https://s.gravatar.com/avatar/e91d5ae3XXXXXXXXXXX?s=480&r=pg&d=https%3A%2F%2Fcdn.auth0.com%2Favatars%2Fda.png","user_id":"auth0|5XXXXXXXXX47b1b07d","name":"XXX@XXX.com","nickname":"XXX","identities":[{"user_id":"5767bea338XXXXXX","provider":"auth0","connection":"Username-Password-Authentication","isSocial":false}],"created_at":"2016-06-20T10:00:03.921Z","sub":"auth0|5767beXXXXXXX"}
    

    我希望它能帮助任何尝试将 Play Framework 服务器端与其客户端分离的人!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-06
      • 1970-01-01
      相关资源
      最近更新 更多