来自桌面应用程序的 OAuth2 身份验证代码

OAuth2 authentication code from desktop app

我在使用桌面应用程序和连接到 Blizzard API 时遇到了一些问题。对于 OAuth2,我知道我需要将用户重定向到一个网站,他们在该网站上授权应用程序代表他们访问数据。从那里,有一个重定向 URL,其中包含必须交换访问令牌的授权代码。

我的应用程序适用于桌面,因此我不确定如何从该重定向中获取授权码 URL。这是我用于测试的一些代码:

if self._check_connection():
        self.client_id = os.getenv("BLIZZ_CLIENT_ID")
        self.client_secret = os.getenv("BLIZZ_CLIENT_SECRET")
        self.region = "us"
        state = "abcd1234"

        re = requests.get(f"{BLIZZ_AUTH_URL}?client_id={self.client_id}&response_type=code&redirect_uri={REPO_URL}&locale={self.region}&scope={SC2_SCOPE}&state={state}")

        re_url = re.url
        print(re_url)

更完整的产品会使用网络浏览器让用户授权我的应用程序,但我需要在单击 "Allow" 后获取将在重定向 URL 中的代码。所以我试图在最后一点获取 URL,但是当我将它打印到控制台进行检查时,它不包含授权代码。但是,如果我单击它,它会在浏览器中打开正确的页面,其中包含授权代码。

感谢您花时间阅读,我看过互联网上的各种帖子,但大多数都是关于网络应用程序的,或者他们说了一些模糊的东西,比如 "get the authorization code and exchange it",但没有详细说明是如何做到的实际有效。

有没有什么干净的方法不需要用户基本上从地址栏复制代码并将其粘贴到我的应用程序中?理想情况下,我只想以编程方式获取它并从那里继续。

由于您要求用户通过 OAuth2 提供商授权您的应用程序,因此您需要将正确的重定向 uri 传递给 OAuth2 服务器。

通常它是指向将处理请求的 Web 服务器的有效域。对于桌面应用程序(或移动应用程序),您将没有 Web 服务器,因此您需要一个自定义协议来处理该响应并将其重定向到您的应用程序。

例如,当您单击电子邮件地址超链接 mailto:email@server.com 时,协议 mailto: 告诉浏览器将调用重定向到主机 OS 并打开默认邮件应用程序。这同样适用于大多数与浏览器交互的应用程序,如 Skype、Discord、Twitch 等

对于 windows 个应用,您可以阅读本主题以获取指导:How do I register a custom URL protocol in Windows?

想法是使用 battle.net 登录名打开浏览器,但重定向 url 将指向您的自定义协议,这样您的应用程序将收到包含完整 URL 包括你需要的 authorization_code

请注意,这样做 OS 将启动您的应用程序的新实例,您必须使用某种消息传递 system/pipes/sockets 将数据从新实例重定向到当前实例运行一个。要检测以前 运行 的应用程序,您只需使用互斥体即可。