HMCL-dev / HMCL

A Minecraft Launcher which is multi-functional, cross-platform and popular
https://hmcl.huangyuhui.net
GNU General Public License v3.0
6.89k stars 676 forks source link

[Feature] 微软账户登录添加《临时登录》选项 #2620

Open zkitefly opened 9 months ago

zkitefly commented 9 months ago

描述 | Description

RT,当勾选时,不保存 refreshToken,当第二次启动 HMCL 时就会弹出弹窗要求重新登录,这样可以以防账户被盗?

但缺点也如此,第二次启动 HMCL 时,登录微软账户阶段会使用 refreshToken 刷新 accessToken,无论 accessToken 是否过期,这个可能需要优化下?

image

原因 | Reason

这样可以以防账户被盗?

wifi-left commented 5 months ago

有没有可以让key失效的api? 可以搞个“退出登录(使key失效)” 就算忘了退如果能使key失效也是可以的 (目前只发现修改密码会退)

FunnyShadow commented 5 months ago

有没有可以让key失效的api? 可以搞个“退出登录(使key失效)” 就算忘了退如果能使key失效也是可以的 (目前只发现修改密码会退)

没有吧 如果有的话,access token 泄漏就没有那么可怕了

LJS08 commented 4 months ago

有没有可以让key失效的api? 可以搞个“退出登录(使key失效)” 就算忘了退如果能使key失效也是可以的 (目前只发现修改密码会退)

退出前重申请key,但不保存(直接丢弃)?

zly2006 commented 4 months ago

有没有可以让key失效的api? 可以搞个“退出登录(使key失效)” 就算忘了退如果能使key失效也是可以的 (目前只发现修改密码会退)

有的。https://learn.microsoft.com/en-us/entra/identity-platform/v2-protocols-oidc#send-a-sign-out-request

还有你们都说的什么乱七八糟的,临时登录就不应该请求refresh token,谁家风控会ban成功登录的正常用户??就算你的逻辑是这么nt巨硬也不会,implicit grant本来就没有refresh token需要多次登录,oauth协议都不清楚就来瞎咧咧

zly2006 commented 4 months ago

这会导致频繁的重新登录的,根据 Microsoft 官方文档来看,accessToken 默认生命周期在 60~90 分钟内,平均为 75 分钟,如果不保存 refreshToken 会频繁需要重新登录,而且很可能会触发 Microsoft 官方的风险控制机制导致别的问题 引用:

@FunnyShadow 我不知道你有什么开发经验,我想请问你是从哪里看出来access token过期之后重新请求登录会被风控的,还是说你的参考文献就是大学生选修课论文里拿来凑数的?

请求登录本来就是必要的安全要求,是保证hmcl必须要在用户监督授权下才能访问数据,我想问临时登录要refresh token干嘛?巨硬会傻到因为这个封禁你?除了这么做没有更方便的办法保证用户隐私和安全,请问巨硬为何堵上这条路?找骂?(虽然骂也不少了)

zly2006 commented 4 months ago

这东西写起来也不难,记录一下过期时间,过期了没有refresh token就要求登录,添加一个登出,按照我上面给的文档,改不了几行代码。

应该说,为了这么点破事吵这么多,诸位不看文档瞎咧咧能力真强,这完全是一个不错的功能建议。

虽说Minecraft不像Steam上的游戏有盗号风险,但网吧那种环境,懂的都懂,这个功能很有必要

反对 @8MiYile ,我们保存的是微软账户token,权限scope是整个xbox而不是只有mc,你只是不玩Xbox才无所谓...

FunnyShadow commented 4 months ago

这会导致频繁的重新登录的,根据 Microsoft 官方文档来看,accessToken 默认生命周期在 60~90 分钟内,平均为 75 分钟,如果不保存 refreshToken 会频繁需要重新登录,而且很可能会触发 Microsoft 官方的风险控制机制导致别的问题 引用:

@FunnyShadow 我不知道你有什么开发经验,我想请问你是从哪里看出来access token过期之后重新请求登录会被风控的,还是说你的参考文献就是大学生选修课论文里拿来凑数的?

请求登录本来就是必要的安全要求,是保证hmcl必须要在用户监督授权下才能访问数据,我想问临时登录要refresh token干嘛?巨硬会傻到因为这个封禁你?除了这么做没有更方便的办法保证用户隐私和安全,请问巨硬为何堵上这条路?找骂?(虽然骂也不少了)

就是说,有没有一种可能,我说了频繁二字? 有人频繁调用你 API 你不对它进行一定限制,所有人都来使劲调你 API,得了,成 DDoS 了 就这 GitHub 你 API 调用频繁了还会给你来 ratelimit,你微软登录 API 就没了? 哥们你没试过我可试过太多了,我们之前做微软 Azure 号的时候,这种账号成天被封,新号老号你调多了别的条件再可疑点直接翻车,你隔着儿跟我讲这个?

burningtnt commented 4 months ago

请两位稍微冷静冷静…… 这里是 GitHub,不是给你们互骂的。指出错误可以,但请不要使用侮辱性称呼……

zly2006 commented 4 months ago

这会导致频繁的重新登录的,根据 Microsoft 官方文档来看,accessToken 默认生命周期在 60~90 分钟内,平均为 75 分钟,如果不保存 refreshToken 会频繁需要重新登录,而且很可能会触发 Microsoft 官方的风险控制机制导致别的问题 引用:

@FunnyShadow 我不知道你有什么开发经验,我想请问你是从哪里看出来access token过期之后重新请求登录会被风控的,还是说你的参考文献就是大学生选修课论文里拿来凑数的? 请求登录本来就是必要的安全要求,是保证hmcl必须要在用户监督授权下才能访问数据,我想问临时登录要refresh token干嘛?巨硬会傻到因为这个封禁你?除了这么做没有更方便的办法保证用户隐私和安全,请问巨硬为何堵上这条路?找骂?(虽然骂也不少了)

就是说,有没有一种可能,我说了频繁二字? 有人频繁调用你 API 你不对它进行一定限制,所有人都来使劲调你 API,得了,成 DDoS 了 就这 GitHub 你 API 调用频繁了还会给你来 ratelimit,你微软登录 API 就没了? 哥们你没试过我可试过太多了,我们之前做微软 Azure 号的时候,这种账号成天被封,新号老号你调多了别的条件再可疑点直接翻车,你隔着儿跟我讲这个?

每小时调用一次如何定义为频繁?你的登录服务一个小时只能完成一次请求吗?请注意我说的实现是要把现在不检查过期时间的小bug修了的前提下说的

zly2006 commented 4 months ago

不知道你们的序列化怎么做的,过期时间long搞成double了……

先把这个修了吧, @FunnyShadow 请注意这是HMCL的bug,而不是不能登录

FunnyShadow commented 4 months ago

请两位稍微冷静冷静…… 这里是 GitHub,不是给你们互骂的。指出错误可以,但请不要使用侮辱性称呼……

我承认我前面语言太过激了,很抱歉,昨天晚上没睡好早上起的又很早,看见这个真的很心烦(尤其是本来这 issue 和我就没啥关系,对方对我语言又有些激烈的情况下)

FunnyShadow commented 4 months ago

这会导致频繁的重新登录的,根据 Microsoft 官方文档来看,accessToken 默认生命周期在 60~90 分钟内,平均为 75 分钟,如果不保存 refreshToken 会频繁需要重新登录,而且很可能会触发 Microsoft 官方的风险控制机制导致别的问题 引用:

@FunnyShadow 我不知道你有什么开发经验,我想请问你是从哪里看出来access token过期之后重新请求登录会被风控的,还是说你的参考文献就是大学生选修课论文里拿来凑数的? 请求登录本来就是必要的安全要求,是保证hmcl必须要在用户监督授权下才能访问数据,我想问临时登录要refresh token干嘛?巨硬会傻到因为这个封禁你?除了这么做没有更方便的办法保证用户隐私和安全,请问巨硬为何堵上这条路?找骂?(虽然骂也不少了)

就是说,有没有一种可能,我说了频繁二字? 有人频繁调用你 API 你不对它进行一定限制,所有人都来使劲调你 API,得了,成 DDoS 了 就这 GitHub 你 API 调用频繁了还会给你来 ratelimit,你微软登录 API 就没了? 哥们你没试过我可试过太多了,我们之前做微软 Azure 号的时候,这种账号成天被封,新号老号你调多了别的条件再可疑点直接翻车,你隔着儿跟我讲这个?

每小时调用一次如何定义为频繁?你的登录服务一个小时只能完成一次请求吗?请注意我说的实现是要把现在不检查过期时间的小bug修了的前提下说的

我不确定 HMCL 以及本 Issue 目前的情况以及目的是什么 按照我的理解,本 Issue 的核心目的在于不存储 refreshToken 或者 accessToken,仅将其用于本次启动游戏时登录,也就是说,如果重启一下 HMCL 就会导致登录失效 同时,HMCL 在默认情况下启动后是自动关闭窗口或进程的,也就是说,如果有一个玩家现在别人的电脑上,需要临时登录,同时也需要频繁重启游戏客户端,且不论其复杂程度,就请求数量这一点便算是频繁了罢? 虽然这种情况不属于常规情况,但也不属于一个很不常见的情况,我认为这应当算入用户预期行为

zly2006 commented 4 months ago

按照我的理解,本 Issue 的核心目的在于不存储 refreshToken 或者 accessToken,仅将其用于本次启动游戏时登录

你的理解是错的,access token一个小时后就会过期,所以其实可以保存,实在介意可以选择在ms那里logout

也就是说,如果有一个玩家现在别人的电脑上,需要临时登录,同时也需要频繁重启游戏客户端,且不论其复杂程度,就请求数量这一点便算是频繁了罢? 虽然这种情况不属于常规情况,但也不属于一个很不常见的情况,我认为这应当算入用户预期行为

绷,你手速多块才能达到rate limit?

FunnyShadow commented 4 months ago

RT,当勾选时,不保存 refreshToken,当第二次启动 HMCL 时就会弹出弹窗要求重新登录,这样可以以防账户被盗?

我不觉得我的理解有任何问题,原文里面就这么说的

同时 ratelimit 是一段时间内的累计总值,一般时间在 5~30 分钟之间动态变化,而且 ratelimit 的值也是动态变化的 而且风控系统这种东西判断条件很多,又不止是 ratelimit 这一条,如果你的 IP 地址本身就存在风险,这种限制可能会变得极为严格,再加上国内特殊的环境,部分玩家都会使用梯子来登录正版,异地频繁登录这一条直接就是高危风险,你怎么能确保不被风控?

如果你执意抬杠我觉得这讨论也没啥必要了,无论我给出什么证据你都会杠回来 而且此 Issue 也差不多快该结束了吧?HMCL 开发者那边也算是表示过了这东西不会做或者没法实现了,你可以自己去前面的 comment 里面翻一翻,黄鱼和 Glavo 都已经说过相关的事情了

zly2006 commented 4 months ago

如果你执意抬杠我觉得这讨论也没啥必要了,无论我给出什么证据你都会杠回来 而且此 Issue 也差不多快该结束了吧?HMCL 开发者那边也算是表示过了这东西不会做或者没法实现了,你可以自己去前面的 comment 里面翻一翻,黄鱼和 Glavo 都已经说过相关的事情了

可以实现,issue的原话不一定是最终功能,而且频繁登录这个错误前提是谁提出来的我有点健忘记不清了

zly2006 commented 4 months ago

算了,感觉这功能是真的没意思,谁想做自己参考吧 https://github.com/zly2006/HMCL/tree/temporary-login