首页 > 解决方案 > 来自桌面应用程序的 OAuth2 身份验证代码

问题描述

我在使用我的桌面应用程序和连接到暴雪 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)

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

感谢您抽出宝贵时间阅读,我查看了互联网上的各种帖子,但其中大多数是关于网络应用程序的,或者他们说的是“获取授权码并交换它”之类的模糊内容,但没有详细说明实际情况如何作品。

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

标签: pythonoauthoauth-2.0authorization

解决方案


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

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

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

对于 Windows 应用程序,您可以阅读此主题以获取指导:如何在 Windows 中注册自定义 URL 协议?

这个想法是使用战网登录打开浏览器,但重定向 url 将指向您的自定义协议,这样您的应用程序将收到一条包含完整 URL 的消息,包括authorization_code您需要的。

请注意,通过这样做,操作系统将启动您的应用程序的新实例,您必须使用某种消息传递系统/管道/套接字将数据从新实例重定向到当前运行的实例。要检测以前运行的应用程序,您可以简单地使用互斥锁。


推荐阅读