【问题标题】:Chrome extension / web app session controlChrome 扩展/网络应用会话控制
【发布时间】:2013-12-13 20:11:14
【问题描述】:

我正在创建一个 chrome 扩展程序,而不是一个 chrome webapp。此应用程序仅包含 html、js、图像和 css 文件。应用程序连接到服务器以获取数据。我选择这样做是因为它会减少用户下载的文件数量。使用 Backbone.js,我的应用程序中有一个 MVC 架构。因此应用程序只发送 json。

说到这里,我需要一个会话管理。我计划使用 Google 身份验证,因为该组织有 Google Apps。我需要一种方法,一旦用户使用 google auth 登录,服务器每次应用程序发出请求时都会获取用户名。

如果可能的话,在请求标头中添加用户名是否是个好主意。还是我应该使用 cookie?谁能告诉我在这种情况下如何使用 cookie?

【问题讨论】:

    标签: javascript html google-chrome google-chrome-extension


    【解决方案1】:

    这可能是一个较晚的响应,但鉴于用户在其浏览器中启用了 cookie,我想为您提供一个更优雅的解决方案。 请先阅读我的answer 关于另一个问题。

    现在您可以从内容脚本发送跨源 xhr,您只需将所有身份验证和会话管理存储在仅在服务器上。没错,你只需要根据服务器响应显示用户是否登录,并在客户端显示一个注销按钮。

    只需按照以下步骤操作即可。

    1. 在客户端每当用户访问您的 chrome web 应用程序时,盲目地向您的服务器发出 XmlHttpRequests 而不必担心身份验证,只需在服务器的响应上保留一个标签,我将在下面描述。

    2. 在服务器上 每当您收到请求时检查有效会话或会话 cookie。如果会话有效,则发送正确的响应,如果不发送错误,401 或任何其他响应以与您的客户端通信该会话无效。最好发送类似401 之类的错误代码,因为这样您就可以在客户端放置一个通用脚本来通知他们他们没有登录。

    3. 在客户端如果服务器的响应正确,则显示它,否则显示您网站的登录链接。

    4. 重要提示:如果用户已登录,则显示注销按钮。

    看看我对这个in my extension的实现

    【讨论】:

    • At server whenever you receive a request check for valid sessions or session cookie. 我不明白这个。扩展如何发送会话 cookie?
    • Chrome 将每个域的 cookie 存储在其内部数据库中。每当您从浏览器发送请求(隐身模式除外)时,chrome 都会发送与域关联的所有 cookie。
    • 这些 cookie 是否安全且任何人都无法访问?
    • 这取决于服务器。如果将其设为HTTPOnly cookie,则无法在 javascript 执行环境中访问它。您的网页和扩展程序之间没有区别。
    • @JuzerAli - 我正在尝试向我的 background.js 中的本地服务器发出 XHR 请求。我已经登录到我的本地服务器。每当我通过浏览器地址栏点击我的网络服务时,会话就会被维护(即它发送 cookie 详细信息)。但是,当我的扩展程序的 background.js 文件发出请求时,它不会在标头中发送 cookie。为什么?
    【解决方案2】:

    有关在您的应用中使用 Google 身份验证的帮助,请查看 Google 的 OAuth tutorial,它提供了您所需的一切(我没有时间使用它进行设置)。

    关于会话管理。 Google 使用的OAuth 的实现将令牌存储在localStorage 中。此外,正如extensions overview 中简要提到的,我们应该使用localStorage 来存储数据。因此,我建议您将用户名存储在这里,因为它可以在应用程序的整个生命周期中访问(直到它被卸载)。但是,您可能需要管理存储在此处的名称,并考虑用户登录和注销时应该发生的情况。那就是说;我不确定sessionStorage 是否会是更好的选择,因为我以前从未使用过它,更不用说在扩展程序中了。

    注意

    localStorage 和它的对应物只存储字符串,所以我建议使用一个使用 JSONparsestringify 的包装器来分别获取和设置您的值。

    【讨论】:

    • 另见code.google.com/chrome/extensions/trunk/…,这是一种以同步友好的方式存储设置的新(但实验性)方式。
    • 我不得不承认 API 对我一点吸引力都没有,因为使用回调函数来获取/设置设置至少对我来说会降低代码的吸引力和不整洁。在我看来,简单的 getter/setter 应该用于设置。希望这会有所改变,但由于在现有 API 中使用了回调函数,我猜他们使用这种方法是有原因的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 2012-08-13
    • 1970-01-01
    • 2013-05-23
    • 2013-10-21
    • 1970-01-01
    • 2014-07-13
    相关资源
    最近更新 更多