上篇文章说到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=True<sup data-fn="181ac613-ad9e-4292-b26c-9be9f5dea927" class="fn"><a href="#181ac613-ad9e-4292-b26c-9be9f5dea927" id="181ac613-ad9e-4292-b26c-9be9f5dea927-link">1</a></sup>,
SESSION_COOKIE_HTTPONLY=True<sup data-fn="95b33a41-701b-4158-87f8-e427c679002a" class="fn"><a href="#95b33a41-701b-4158-87f8-e427c679002a" id="95b33a41-701b-4158-87f8-e427c679002a-link">2</a></sup>,
SESSION_COOKIE_SAMESITE="None"<sup data-fn="0ce9c5aa-c8c8-410b-9700-36e9fafcc6d8" class="fn"><a href="#0ce9c5aa-c8c8-410b-9700-36e9fafcc6d8" id="0ce9c5aa-c8c8-410b-9700-36e9fafcc6d8-link">3</a></sup>
)
这样服务端的准备就完成了,下面修改扩展。把之前的所有处理全部删掉
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
Warning: Undefined variable $return_smiles in /www/wwwroot/yangyiit.top/wp-content/themes/sakura-3.4.0/functions.php on line 1104