API 设计 - 一个域上的应用程序,另一个域上的 api。如何在不传递用户 ID 的情况下检

我正在尝试使用 Golang 和 Angular JS 构建一个非常简单的 Web 应用程序(用于学习目的)。

我对 Go 和 AngularJS 代码很满意,但在尝试创建合适的 API 结构时遇到了困难。

目前,我将所有运行应用程序的代码和 API 代码捆绑在一起。

理想情况下,我想将其分开,这样我就可以让我的应用程序在 app.mything.com 等子域上运行,而 API 在 api.mything.com 上运行

我的问题是我的 API 有 MYSQL 调用,例如 -

select * FROM sometable where userid = userID

userID 是保存在会话中的用户 ID。

因此,虽然所有代码都捆绑在一起,但这是可能的并且工作正常。如果我要将代码分离到两个单独的子域,则这两个域都无法访问会话。

怎么可能实现这样的目标?


慕码人8056858
浏览 177回答 2
2回答

饮歌长啸

您仍然可以访问用户 ID。您在 api.domain.com 上的 API 服务器可以在登录时将 ID 保存在会话 cookie 中。cookie 将用于api.domain.com域。默认情况下使用gorilla/sessions来获取签名的 cookie。www.example.com由于浏览器对 cookie 强制执行的同源策略,(不同域)上的 Angular 客户端将根本无法读取/写入cookie,但仍会在 AJAX 请求中将 cookie 发送回api.domain.com服务器。根据 Angular 文档(https://docs.angularjs.org/api/ng/service/&nbsp;$http),您需要设置withCredentials = true在跨域请求上发送 cookie(参考:Mozilla CORS 文档)。发出请求以获取 cookie(例如通过 HTTPS POST 登录凭据),然后连续的 AJAX 请求将将该 cookie 呈现给服务器。另一种方法是发布 OAuth2 不记名令牌(“令牌身份验证”),在后端(Redis、Bolt、mySQL 等)中记录令牌 <=> 用户 ID,并让 Angular 应用程序将其保存在本地存储中并将其发送到每个请求的头部。

HUX布斯

有两种方法可以解决这个问题:将会话存储更改为 API 和应用程序共享的内容(即:MySQL)。开始使用(加密的)cookie 而不是会话数据。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go