如何跨子域进行身份验证

Posted

技术标签:

【中文标题】如何跨子域进行身份验证【英文标题】:How To Authenticate Across Subdomains 【发布时间】:2014-10-25 21:14:45 【问题描述】:

我正在开发一个实际上由两个应用程序组成的网络应用程序。一个应用程序称为account,它处理与用户帐户相关的所有事情,例如帐户的身份验证、注册和管理。我还有一个应用程序,我们只需调用web

问题是account 使用 SSL/TLS 监听 https://account.domain.com,而网络监听 http://www.domain.com。

我有哪些选项可以让人们登录并验证account.domain.com,然后将他们重定向到他们实际登录的www.domain.com。据我所知,您无法在account.domain.com 然后让它在 domain.com 上运行,因为这会带来安全风险。

关于我的应用程序的一些背景细节:

    用 Go 编程语言编写。

    将 Gorilla Toolkit 用于大多数 HTTP/HTTPS 接口、URL 路由和处理 POST/GET 参数。

    两个应用程序都存在于同一个虚拟服务器上。

我正在寻找一种安全的方式来验证和管理跨所有子域和实际域domain.com 的会话。我对这个主题不是特别精通,所以除了设置cookie之外,我知道的不多。

【问题讨论】:

为什么您认为您无法从域 account.domain.com 中设置 domain=domain.com 的域 cookie?只要浏览器接受 domain.com 作为 ETLD+1(参见 publicsuffix.org),它就可以工作。 我不完全确定公共后缀是什么或它是如何工作的,但是深入研究它听起来并不是所有主要浏览器都支持这一点。我需要至少适用于最新版本的 IE、Firefox、Opera、Chrome 和 Safari 的东西。 这可能无法回答您更广泛的会话管理问题,但您应该能够从anything.domain.com 在.domain.com 上设置cookie——不会出现有关公共后缀列表的详细信息上面这儿。只需确保 Cookie.Domain 是 .domain.com,而不是 www.domain.com。 (这看起来更像是一个浏览器/HTTP/javascript 问题,而不是一个 Go 问题。) 这里真正的问题是,在两个域中使用 cookie(这意味着 Secure: false)是攻击者(坐在咖啡馆或利用 XSS 漏洞利用的人)可以轻松修改(MITM ; cafe) 或读取 (XSS, if HttpOnly: True) cookie 内容。因此,请绝对确保您没有存储任何关键或仅用于识别权限的内容。最好将www.domain.com 也放在 TLS/SSL 后面。 如果有人读取会话 ID 会发生什么?还是移动设备上的用户通过隧道? 【参考方案1】:

我对大猩猩不够熟悉,但应该可以:

var store = sessions.NewCookieStore([]byte("something-very-secret"))

func init() 
    store.Options = &sessions.Options
        Domain:   "domain.com", //this
        HttpOnly: true,
    

基本上你只需要将cookie的域设置为.domain.com(前缀.),在https://***.com/a/1063760/145587中有更详细的解释

//编辑

根据@Volker,点不是必需的(请参阅 cmets)。

【讨论】:

不需要以点开头的域:“domain=domain.com”在所有浏览器上都与“domain=.domain.com”一样有效。请参阅被广泛采用的 RFC 6265。

以上是关于如何跨子域进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法让一个人在跨子域的 firebase 上进行身份验证

Firebase - 使用 firebase admin sdk 跨子域共享身份验证

通过多个 Laravel 5 安装跨子域共享身份验证会话

Cognito - 如何在与客户端从(通过放大)获得令牌的子域不同的子域上对 nodejs 后端的客户端进行身份验证?

子域和使用 laravel 进行身份验证

跨多个页面进行身份验证