PCL2 icon indicating copy to clipboard operation
PCL2 copied to clipboard

使用授权代码流登录微软帐户

Open allMagicNB opened this issue 9 months ago • 14 comments

检查项

描述

将设备代码流更改为授权代码流,或是两者共存。

原因

此授权方式免去了输入代码的时间,且在第一次同意授权之后下次可以直接登录。

allMagicNB avatar Mar 23 '25 07:03 allMagicNB

如果只是将设备代码流改为授权代码流,那么对于公共环境下无法做到将用户账户和不受信任的设备隔离,因此存在安全风险 所以如果要做,应该考虑共存而非替代

copytiao avatar Mar 23 '25 09:03 copytiao

呃,授权代码流是指的哪一个?

Image

LTCatt avatar Mar 23 '25 10:03 LTCatt

呃,授权代码流是指的哪一个?

Image

第一个。

allMagicNB avatar Mar 23 '25 10:03 allMagicNB

呃,授权代码流是指的哪一个?

Image

https://learn.microsoft.com/zh-cn/entra/identity-platform/v2-oauth2-auth-code-flow#request-an-authorization-code

其实就是旧的微软登录,但是把 Client ID 和 redirect_url 换成自己的

链接长这个样子

https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize?client_id=<ClientID>&response_type=code
&redirect_uri=http://localhost:port/api/login&response_mode=query&scope=XboxLive.signin offline_access

copytiao avatar Mar 23 '25 10:03 copytiao

我认为:使用授权代码流需要设置一个服务器或者在本地开设一个服务器。虽然可以用HttpListener,但是会出现windows 防火墙弹窗,可能对部分用户担忧。 而且:设备代码流其实是一个接入方式最简单的方法。

Hill23333 avatar Mar 23 '25 10:03 Hill23333

我认为:使用授权代码流需要设置一个服务器或者在本地开设一个服务器。虽然可以用HttpListener,但是会出现windows 防火墙弹窗,可能对部分用户担忧。 而且:设备代码流其实是一个接入方式最简单的方法。

先再用内置 IE 试试。(

allMagicNB avatar Mar 23 '25 10:03 allMagicNB

我认为:使用授权代码流需要设置一个服务器或者在本地开设一个服务器。虽然可以用HttpListener,但是会出现windows 防火墙弹窗,可能对部分用户担忧。 而且:设备代码流其实是一个接入方式最简单的方法。

其实也可以用 MSAL(微软自己整的身份认证支持库),似乎能调用 IWA 登录

copytiao avatar Mar 23 '25 10:03 copytiao

先再用内置 IE 试试。(

1.IE是个浏览器,我并不认为它提供的API具有服务器功能。 2.使用IE你需要考虑不同版本的兼容性。毕竟IE6到IE11都是不同浏览器这句话不是假的。 3.考虑跨平台兼容性 尽量不要使用非跨平台方案。(虽然PCL跨平台遥遥无期)

Hill23333 avatar Mar 23 '25 10:03 Hill23333

1.IE是个浏览器,我并不认为它提供的API具有服务器功能。

这东西的原理是,获取当前窗口的 Url,并从中提取出授权代码,而不是开 HTTP Server

2.使用IE你需要考虑不同版本的兼容性。毕竟IE6到IE11都是不同浏览器这句话不是假的。

只要给系统打过补丁默认版本就是 Internet Explorer 11,因为IE 的补丁大部分是安全补丁而不是质量更新补丁....

3.考虑跨平台兼容性 尽量不要使用非跨平台方案。(虽然PCL跨平台遥遥无期)

其实可以把现在的登录方案留下来,两种授权方式最后拿下来的都是 AccessToken

copytiao avatar Mar 23 '25 10:03 copytiao

这东西的原理是,获取当前窗口的 Url,并从中提取出授权代码,而不是开 HTTP Server

之前版本的PCL需要用户手动复制登录链接,我认为这比设备代码流更加繁琐。 如果你说的是直接从ie窗口获取url 那当我没说...不过我认为还是让用户可以使用自己的浏览器或者直接内部弹出登录窗口。并且也得考虑跨平台问题。(毕竟你不希望到时候跨平台是这是个windows only功能,对吧?)

Hill23333 avatar Mar 23 '25 10:03 Hill23333

之前版本的PCL需要用户手动复制登录链接,我认为这比设备代码流更加繁琐。 如果你说的是直接从ie窗口获取url 那当我没说...不过我认为还是让用户可以使用自己的浏览器或者直接内部弹出登录窗口。并且也得考虑跨平台问题。(毕竟你不希望到时候跨平台是这是个windows only功能,对吧?)

我在上文已经提供了一种方案——使用 MSAL 来完成这部分内容 对于支持集成 Windows 身份认证(IWA)的环境,MSAL 会调用 IWA 完成认证 对于不支持的环境,MSAL 会尝试回退到系统自带浏览器完成登录

参考 Microsoft 身份验证库 (MSAL)

Edit:

@Hill23333 对于防火墙问题,Win32 API 也提供了对应接口来设置放行,或者使用 ShellOnly 调用 netsh 也能实现类似功能 所以从理论角度上,没有安全提示的 HttpListener 并非没有可能

Edit:

@Hill23333 我暂且非常不认同你的观点

如果说防火墙通行权限/管理员权限会让用户感到焦虑,那么 PCL 还具有更多可以让用户焦虑的功能

但是普通用户有说啥嘛?很显然没有,就算有也是少数,因为信任链的存在,普通用户只会无条件相信开发者,真出问题了又会选择相信第三方(例如微软或者 360、 火绒等)有能力解决这个问题,某种意义上这也是侠客产生的原因之一。

虽然不能否认这个问题确实存在,但这只能交由用户自行选择,用户信任就是信任,不信任就是不信任,你不能改变用户的观点,如果不相信某个开发者发行的软件,最好的办法就是别用

如果你说的是直接从ie窗口获取url 那当我没说...不过我认为还是让用户可以使用自己的浏览器或者直接内部弹出登录窗口。并且也得考虑跨平台问题。(毕竟你不希望到时候跨平台是这是个windows only功能,对吧?)

EdgeWebview 也不跨平台,也是 WindowsOnly,如果真要考虑用户的焦虑,那么只能考虑不跨平台或者直接放弃这个提案

我的观点是,既然可以焦虑的功能已经很多了,那么再多一个也无伤大雅,甚至 Windows 更可能让用户焦虑(静默加防火墙甚至没有提示,也有能力窃取用户隐私,必要情况下可以抹掉全盘文件),你有看见过因为这个问题感到焦虑的人吗?

copytiao avatar Mar 23 '25 10:03 copytiao

我在上文已经提供了一种方案——使用 MSAL 来完成这部分内容 对于支持集成 Windows 身份认证(IWA)的环境,MSAL 会调用 IWA 完成认证 对于不支持的环境,MSAL 会尝试回退到系统自带浏览器完成登录

参考 Microsoft 身份验证库 (MSAL)

  1. 我刚才看了下代码,MSAL 在底层有两种方式:内嵌 WebView2 窗口或系统浏览器。 第一种方法很明显不可以。毕竟你不能强制用户安装 WebView2。 第二种方法的实现还是用到了 HttpListener。因此无法避免防火墙弹窗的问题。
  2. IWA 实际上是废弃功能。(并且不能跨平台) Image 不过使用图上提到的 WAM 确实是一个好方案,但是这个方案只支持 Windows 10+ 的系统。

Edit:

@shimoranla 修改 Windows 防火墙 您提供的这几种方法都需要管理员权限。管理员权限的申请比防火墙放行会更让用户焦虑。

Hill23333 avatar Mar 23 '25 12:03 Hill23333

目前添加一种新的登录方式的需求并不大,先丢投票吧

LTCatt avatar Mar 23 '25 22:03 LTCatt

该 issue 已进入 功能投票 #5947,你可以点击左侧链接继续讨论或投票!

HexDragon-Bot avatar Mar 23 '25 22:03 HexDragon-Bot