[求助] Windows 桌面客户端怎么优雅地进行 OAuth 授权? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
Kiriz
V2EX    程序员

[求助] Windows 桌面客户端怎么优雅地进行 OAuth 授权?

  •  
  •   Kiriz 2019-02-24 22:26:06 +08:00 3231 次点击
    这是一个创建于 2511 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在写一个网站的第三方 Windows 客户端,wpf

    网站授权用的是 OAuth 授权

    一般流程是 登录网站 → 授权 → 回调 → 返回 token

    由于这个网站登录必须要验证码,而且验证码机制好像挺复杂,思考了两天没办法用单纯的 http client 来解决

    所以就考虑内置一个浏览器了(

    现在有几个思路,但都不是很好:

    1. 用原生的 webbrowser,优点是内置,快,小 缺点是 IE 或者有其他坑 具体还没研究
    2. 用现代一点的 webview,优点是 Edge 缺点是要求 Windows10 1803 以上 老系统不友好
    3. 用 Cef ( Chromium ),优点是相比 2 几乎没有系统要求 缺点是程序要带一个 100+M 的 ceflib (可以 headless 而且授权结束后可以杀掉 chromium 内存其实很安逸
    4. electron 不会考虑的 一方面不会写 另一方面长得像浏览器 嫌弃, 个人也不可能做到 vs code 级别的优化
    5. 调用默认浏览器,最后把 token 显示在屏幕上,让用户复制进客户端。。。

    那么有什么更好的方案吗?

    11 条回复    2019-02-25 09:42:08 +08:00
    yexiaoxing
        1
    yexiaoxing  
       2019-02-24 22:44:00 +08:00
    调用浏览器,并本地监听一个 HTTP 服务(不一定要 80 );授权完成,通过 HTTP 服务反馈给应用?
    rb6221
        2
    rb6221  
       2019-02-24 22:51:22 +08:00
    就一个授权页,而且一般是一次性使用 几秒钟就跳过去了。当然是考虑兼容性最好的啊
    ysc3839
        3
    ysc3839  
       2019-02-24 23:16:05 +08:00 via Android
    1 和 2 可以看作同一个方案。WebBrowser 可以用一些 hack 的方法使用 Edge 的内核。不 hack 的话也可以实现检测操作系统版本然后进行选择。
    3 是兼容性最佳的方案,至于体积则是看你能不能接受了,能接受的话推荐这个方案。
    4 不如 CEF。
    5 的话对用户不太友好,同时兼容性也不好保证。
    ysc3839
        4
    ysc3839  
       2019-02-24 23:23:07 +08:00 via Android
    @ysc3839 CEF 较旧的版本体积会小一点,如果确认登录页面在旧版本下没问题的话可以选择。
    MonoLogueChi
        5
    MonoLogueChi  
       2019-02-24 23:27:37 +08:00 via Android
    按理说第一个方案可行性是最高的,现在需要操作的只有一个网站,甚至是只有两个页面,确定 IE 兼容就可以了
    orangeade
        6
    orangeade  
       2019-02-24 23:41:00 +08:00 via Android
    我记得 Google Drive 就是本地起个 HTTP
    Tink
        7
    Tink  
    PRO
       2019-02-24 23:41:37 +08:00
    调用 chrome
    theks
        8
    theks  
       2019-02-25 01:01:18 +08:00 via Android   2
    我觉得你可能想复杂了。
    网页中的验证码应该用到了 session 或者 cookie 标识,一般是程序生成一个图片以流的形式直接返回响应,就像网络上的一个静态图片一样。
    应该可以用 httpwebclient 或者 httprequest 请求这个二维码地址,把拿到的 cookie(在响应的 header 里,session 也是基于 cookie 的)传递给登录接口,把图片(响应的 content 部分是图片的二进制流)写入到 winform 的 image 控件显示出来。
    我四五年没有碰过.net 了,只是提供个思路,不保证你能按我说的实现。
    applehater
        9
    applehater  
       2019-02-25 01:25:34 +08:00 via iPhone
    wpf 应该有网页控件并且可以拦截 http 请求吧,拦截道授权码就行。登录页面应该简单也不会有多大不兼容。vs 就是 wpf 开发的,可以看看 vs 登录微软账号是怎么做的咯
    Eytoyes
        10
    Eytoyes  
       2019-02-25 08:48:35 +08:00
    客户端与 Chromium 分离出来,安装好客户端后再去下载 Chromium 解压出来,个人愚见
    micate
        11
    micate  
       2019-02-25 09:42:08 +08:00
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     987 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms TC 23:18 PVG 07:18 LAX 15:18 JFK 18:18
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86