V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Kiriz
V2EX  ›  程序员

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

  •  
  •   Kiriz · Feb 24, 2019 · 3427 views
    This topic created in 2631 days ago, the information mentioned may be changed or developed.

    最近在写一个网站的第三方 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 replies    2019-02-25 09:42:08 +08:00
    yexiaoxing
        1
    yexiaoxing  
       Feb 24, 2019
    调用浏览器,并本地监听一个 HTTP 服务(不一定要 80 );授权完成,通过 HTTP 服务反馈给应用?
    rb6221
        2
    rb6221  
       Feb 24, 2019
    就一个授权页,而且一般是一次性使用 几秒钟就跳过去了。当然是考虑兼容性最好的啊
    ysc3839
        3
    ysc3839  
       Feb 24, 2019 via Android
    1 和 2 可以看作同一个方案。WebBrowser 可以用一些 hack 的方法使用 Edge 的内核。不 hack 的话也可以实现检测操作系统版本然后进行选择。
    3 是兼容性最佳的方案,至于体积则是看你能不能接受了,能接受的话推荐这个方案。
    4 不如 CEF。
    5 的话对用户不太友好,同时兼容性也不好保证。
    ysc3839
        4
    ysc3839  
       Feb 24, 2019 via Android
    @ysc3839 CEF 较旧的版本体积会小一点,如果确认登录页面在旧版本下没问题的话可以选择。
    MonoLogueChi
        5
    MonoLogueChi  
       Feb 24, 2019 via Android
    按理说第一个方案可行性是最高的,现在需要操作的只有一个网站,甚至是只有两个页面,确定 IE 兼容就可以了
    orangeade
        6
    orangeade  
       Feb 24, 2019 via Android
    我记得 Google Drive 就是本地起个 HTTP
    Tink
        7
    Tink  
    PRO
       Feb 24, 2019
    调用 chrome
    theks
        8
    theks  
       Feb 25, 2019 via Android   ❤️ 2
    我觉得你可能想复杂了。
    网页中的验证码应该用到了 session 或者 cookie 标识,一般是程序生成一个图片以流的形式直接返回响应,就像网络上的一个静态图片一样。
    应该可以用 httpwebclient 或者 httprequest 请求这个二维码地址,把拿到的 cookie(在响应的 header 里,session 也是基于 cookie 的)传递给登录接口,把图片(响应的 content 部分是图片的二进制流)写入到 winform 的 image 控件显示出来。
    我四五年没有碰过.net 了,只是提供个思路,不保证你能按我说的实现。
    applehater
        9
    applehater  
       Feb 25, 2019 via iPhone
    wpf 应该有网页控件并且可以拦截 http 请求吧,拦截道授权码就行。登录页面应该简单也不会有多大不兼容。vs 就是 wpf 开发的,可以看看 vs 登录微软账号是怎么做的咯
    Eytoyes
        10
    Eytoyes  
       Feb 25, 2019
    客户端与 Chromium 分离出来,安装好客户端后再去下载 Chromium 解压出来,个人愚见
    micate
        11
    micate  
       Feb 25, 2019
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2802 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 59ms · UTC 01:49 · PVG 09:49 · LAX 18:49 · JFK 21:49
    ♥ Do have faith in what you're doing.