如何跨子域进行身份验证
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 跨子域共享身份验证