上篇文章说到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,当然登录用户要和授权用户一样(废话)
以上就是我针对扩展两个比较烂的设计做出的更改,现在完成这两个操作已经完全对用户隐藏。
Comments | NOTHING