V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
JKeita
V2EX  ›  问与答

桌面端应用调用 HTML 登录页是怎么实现的。

  •  
  •   JKeita · 2021-09-09 10:11:38 +08:00 · 2985 次点击
    这是一个创建于 1163 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求是编写 dll 能够弹出一个 web 登录页面并且进行回调;

    微软有一个 webview2 但是兼容性不好,依赖 edge 。

    最好是使用 golang 编写 dll,然后调用 html 页面的实现。

    28 条回复    2021-09-10 09:34:10 +08:00
    lscexpress
        1
    lscexpress  
       2021-09-09 10:15:18 +08:00
    关键字,qt,微信或 qq 登录
    tianxia
        2
    tianxia  
       2021-09-09 10:17:36 +08:00 via Android
    aardoid
    JKeita
        3
    JKeita  
    OP
       2021-09-09 10:18:54 +08:00
    @tianxia 是 PC 端不是安卓应用
    JKeita
        4
    JKeita  
    OP
       2021-09-09 10:19:28 +08:00
    @lscexpress 是自己实现的登录,应用调用自己的 web 登录页。
    tianxia
        5
    tianxia  
       2021-09-09 10:19:56 +08:00 via Android
    @JKeita 写错了,aardio
    learnshare
        6
    learnshare  
       2021-09-09 10:22:06 +08:00   ❤️ 4
    流行的方式是打开浏览器,登录完成后通过 URI scheme 跳转回应用
    比如 Sourcetree 、VS Code 、Github Desktop
    JKeita
        7
    JKeita  
    OP
       2021-09-09 10:23:27 +08:00
    @tianxia 好像不行,需求是编写一个 dll SDK 供其他应用调用自己的登录。
    youyouyou0123456
        8
    youyouyou0123456  
       2021-09-09 10:24:50 +08:00
    打开浏览器验证就好了。觉得体验不好可以嵌入一个 cef,通过 cef 的回调验证。
    JKeita
        9
    JKeita  
    OP
       2021-09-09 10:25:51 +08:00
    @youyouyou0123456 打开浏览器不行吧,登录后的用户信息数据要回传给应用使用。
    learnshare
        10
    learnshare  
       2021-09-09 10:34:46 +08:00
    @JKeita 浏览器登录一般是返回 token,根据 token 获取其他信息就是了
    nutting
        11
    nutting  
       2021-09-09 10:41:44 +08:00
    那种能检测到已经登录,我以为是扫描 cookie 了
    xieqiqiang00
        12
    xieqiqiang00  
       2021-09-09 10:49:14 +08:00
    自己启动一个服务器,然后用 oauth2.0 那种方法是申请授权就好了
    xieqiqiang00
        13
    xieqiqiang00  
       2021-09-09 10:50:37 +08:00
    ysc3839
        14
    ysc3839  
       2021-09-09 10:51:26 +08:00
    WebView2 可以自带依赖文件,最老能兼容 Win7 系统。
    还可以用 CEF https://bitbucket.org/chromiumembedded/cef,但是代码复杂很多,无特殊需求的情况下不比 Edge 有优势。
    还有一个选择是使用系统内置的 IE 内核,但是就算是 IE 最新版,也有很多特性不支持,更何况用户可能还在用 IE8 等老版本。
    JKeita
        15
    JKeita  
    OP
       2021-09-09 11:00:46 +08:00
    @ysc3839 webview2 再自带依赖那个文件太大了,那个运行环境就得 100 多 MB
    JKeita
        16
    JKeita  
    OP
       2021-09-09 11:01:59 +08:00
    @ysc3839 使用 IE 也不行,win10 都不支持了。我看挺多软件都实现很好不懂怎么搞得,比如 nvidia expression
    JKeita
        17
    JKeita  
    OP
       2021-09-09 11:02:53 +08:00
    @xieqiqiang00 额,现在就是不知怎么编写 dll 调用 web 登录页回调。
    joesonw
        18
    joesonw  
       2021-09-09 11:17:34 +08:00
    本地起服务器监听例如 :9090, 网页登录成功后带着 ticket 回调 localhost:9090
    JKeita
        19
    JKeita  
    OP
       2021-09-09 11:24:27 +08:00
    @joesonw 不是,这是需要编写一个 dll,相当于给第三方应用的 SDK 登录
    codehz
        20
    codehz  
       2021-09-09 11:24:54 +08:00 via Android
    @JKeita ie 控件会一直支持)
    sutra
        21
    sutra  
       2021-09-09 11:26:52 +08:00
    是不是用了类似 jsbridge 的东西来实现?
    ysc3839
        22
    ysc3839  
       2021-09-09 11:30:01 +08:00
    @JKeita Win10 以及 Win11 都还会支持嵌入式的 IE 控件,不支持的是 IE 的主程序。其他软件八成是带了个 CEF 。
    ysc3839
        23
    ysc3839  
       2021-09-09 11:39:48 +08:00
    另外个人也是建议打开系统中的浏览器来登录,这样如果用户已经登录过的话就不需要重新输入密码等等。
    以及程序内置的浏览器是有能力窃取用户密码的,我自己是不太信任的。使用系统中的浏览器则没有这个问题,程序最终只能拿到 token 。
    mmdsun
        24
    mmdsun  
       2021-09-09 12:43:03 +08:00 via Android
    @JKeita IE 就算不支持微软也不会删除那个调用。win11 也有 IE 的模块。

    C#的话可以用 WebBrowser 控件启动浏览器,与客户端完美交互。
    [客户端调用网页 js] :
    webBrowser1.Document.InvokeScript("sayHello",args...);
    [网页调用客户端方法] :
    类上加[ComVisible(true)],客户端函数自动注入到网页的 windows 对象里面。windows.函数名就能调用。

    其他语言调用系统 dll 即可,比如( MSHTML.dll ) WebBrowser 控件本质上是 COM 组件。
    j717273419
        25
    j717273419  
       2021-09-09 12:52:22 +08:00
    我能想到 2 个方案,
    1,是在 pc 应用中起一个站点,然后在网页中打开.局域网通信.
    2,是在 pc 应用注册一个本地的协议,类似你用 thunder://这样能打开迅雷,
    https://img-blog.csdnimg.cn/20190406095718114.png
    g00001
        27
    g00001  
       2021-09-09 14:53:58 +08:00
    WebView2 基于 Edge 但与 Edge 完全分离,支持 WIN7,WIN10,WIN11,WIN11 已经自带 WebView2,Office 也会自动安装 WebView2,目前已经有 2 亿台电脑安装了 WebView2,并且未来大概率会完全普及。

    使用 WebView2 的软件会公用一个运行时,由系统维护并且会自动更新内核。且 WebView2 的下载安装速度很快,在国内仍然瞬间就能下载安装好。aardio 里的 WebView2 在调用时就会自动检测,如果没有安装会自动安装 —— 瞬间完成用户体验很好。

    WebView2 用来开发桌面软件的优势是与本地语言交互的接口很简洁,比 Electron 笨拙的多进程交互方便太多。用 aardio 实现的一个例子:


    如果只是为了做登录窗口,也可以考虑 Sciter JS (支持跨平台) , 可以理解为一个迷你版的 WebView2,而且对桌面开发友好,提供了很多传统网页没有的接口和功能,体积和占用的内存都非常小。Sciter 的前身 HTMLayout,体积更小(只有 2MB ),做出来的界面也非常炫。其实可以用 HTML 写界面的方案很多,aardio 范例里就提供了很多这样的例子:


    aardio 还可以在任意能执行 JavaScript 的浏览器里通过 aardio.js 调用 aardio 程序导出的函数(调用标准库 web.rpc.externalServer )。
    xieqiqiang00
        28
    xieqiqiang00  
       2021-09-10 09:34:10 +08:00
    @JKeita 怎么打开浏览器你不知道吗...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4795 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 03:58 · PVG 11:58 · LAX 19:58 · JFK 22:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.