V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Kiriz
V2EX  ›  程序员

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

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

    最近在写一个网站的第三方 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 服务反馈给应用?
    janus77
        2
    janus77  
       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  
       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   ·   实用小工具   ·   913 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 20:10 · PVG 04:10 · LAX 12:10 · JFK 15:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.