为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕码人8056858 2021-11-15 20:57:20
我正在尝试使用 Golang 和 Angular JS 构建一个非常简单的 Web 应用程序(用于学习目的)。我对 Go 和 AngularJS 代码很满意,但在尝试创建合适的 API 结构时遇到了困难。目前,我将所有运行应用程序的代码和 API 代码捆绑在一起。理想情况下,我想将其分开,这样我就可以让我的应用程序在 app.mything.com 等子域上运行,而 API 在 api.mything.com 上运行我的问题是我的 API 有 MYSQL 调用,例如 -select * FROM sometable where userid = userIDuserID 是保存在会话中的用户 ID。因此,虽然所有代码都捆绑在一起,但这是可能的并且工作正常。如果我要将代码分离到两个单独的子域,则这两个域都无法访问会话。怎么可能实现这样的目标?
查看完整描述

2 回答

?
饮歌长啸

TA贡献1951条经验 获得超3个赞

您仍然可以访问用户 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/ $http),您需要设置withCredentials = true在跨域请求上发送 cookie(参考:Mozilla CORS 文档)。发出请求以获取 cookie(例如通过 HTTPS POST 登录凭据),然后连续的 AJAX 请求将将该 cookie 呈现给服务器。

另一种方法是发布 OAuth2 不记名令牌(“令牌身份验证”),在后端(Redis、Bolt、mySQL 等)中记录令牌 <=> 用户 ID,并让 Angular 应用程序将其保存在本地存储中并将其发送到每个请求的头部。


查看完整回答
反对 回复 2021-11-15
?
HUX布斯

TA贡献1876条经验 获得超6个赞

有两种方法可以解决这个问题:

  • 将会话存储更改为 API 和应用程序共享的内容(即:MySQL)。

  • 开始使用(加密的)cookie 而不是会话数据。


查看完整回答
反对 回复 2021-11-15
  • 2 回答
  • 0 关注
  • 176 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信