ShangCloud扩展设计(2)

发布于 11 天前  77 次阅读


上篇文章说到ShangCloud是如何从后端获取AccessToken的,这一篇来说一下关于快速获取用户信息和刷新Token是怎么做的。

最开始的时候,我采用了和AccessToken一样的方式,通过一个窗口回调和Window.postMessage API来解决这个问题。但是显然弹出窗口不是很优雅,所以我将目光转向了跨域Cookie。首先来设置/api接口允许任意来源的跨域。

CORS(app, resources={
        r"/api*": {
            "origins": white_url,
            "supports_credentials": True
        }
    })

然后放行跨域Cookie

app.config.update(
            SECRET_KEY=secrets.token_hex(32),
            PERMANENT_SESSION_LIFETIME=timedelta(days=14),
            SESSION_COOKIE_SECURE=True1,
            SESSION_COOKIE_HTTPONLY=True2,
            SESSION_COOKIE_SAMESITE="None"3
        )

这样服务端的准备就完成了,下面修改扩展。把之前的所有处理全部删掉

const res = await fetch(SHANGCLOUD_ORIGIN + "/api/info/me", {method: "POST",credentials: 'include'});
const data = await res.json();
if (!data.data) {
  return;
}
uid = data.data.uid;
nickname = data.data.nickname;

就这几行代码就可以完成原本的功能,注意,在请求的时候一定要有credentials: 'include'否则Cookie是不会被自动添加的。

秉持这这样的思路,我也同样重新设计了刷新Token的接口,添加了一个/api/oauth/token/quick接口,适用于Scratch应用快速刷新Token而不用发送ClientSecret(这会暴漏不该出现的东西)

该接口不需要Authorization参数,也不需要指定grant_type,只需要传入refresh_token,如果用户登录了ShangCloud,那么程序会返回刷新过后的Token,当然登录用户要和授权用户一样(废话)

以上就是我针对扩展两个比较烂的设计做出的更改,现在完成这两个操作已经完全对用户隐藏。

  1. 仅允许Cookie在HTTPS下传输 ↩︎
  2. 过程序(JS脚本、Applet等)将无法读取到Cookie信息,这样能有效的防止XSS攻击 ↩︎
  3. 不对Cookie做跨域限制,注意该设置仅在SESSION_COOKIE_SECURE=True时有效 ↩︎


保持热爱,奔赴山海