了解Google OAuth2的JWT令牌

本文关键字:JWT 令牌 OAuth2 Google 了解 | 更新日期: 2023-09-27 18:28:10

ETA 2:

我能够使用公开的文档和我的SO对密码学的丰富知识,以及MSDN上一个方便的代码示例来解决所有这些问题,该示例处理了OAuth2实现的最重要部分——验证签名JWT的完整性。

我在博客上详细介绍了一个由三部分组成的系列。

关键组件是验证来自OAuth2提供商的JWT响应的完整性-许多开发人员由于对加密功能了解不足而无法正确实现这一点,这就是为什么来自各种提供商(包括谷歌)的公共文档建议使用预先存在的库来处理身份验证。

问题是DotNetOpenAuth已经有年没有更新了,我不建议使用老化的库进行身份验证,因为不知道哪些安全漏洞可能仍然没有修补。

C#中的验证组件使用RSAPKCS1SignatureDeformatter.VerifySignature,MSDN文章中关于该方法的示例代码几乎是逐字逐句的,您需要使用它来确保签名的JWT是有效的,并且没有被恶意的第三方截获。

ETA:

我之所以在Stack Overflow上发布这篇文章,是因为Google专门使用Google-outh2标签将用户引导到Stack Overlay,以获取有关Google oauth2 API的问题、帮助和支持。所有Google OAuth2支持的堆栈溢出迁移于2013年3月实现,如本公告所示:

https://groups.google.com/forum/#!论坛/oauth2开发

场景:

使用第三方用户登录的新ASP.NET C#应用程序。我首先实现了Google OAuth2,然后将转向其他服务(Facebook、通用OpenID等)。我知道C#有现有的库,但如果可能的话,我希望避免使用第三方库。

经过长时间阅读谷歌的OAuth2文档并弄清楚JWT规范,我已经走了很长一段路。然而,我正在努力确保我理解Base64编码的JWT的第三部分,一旦用户允许我的应用程序使用他们的帐户,它就会由谷歌返回。

前两段只是Base64编码的明文。有那么多;使用JavaScriptSerializer很容易解码和解析。我所关注的是第三部分,据我所知,它需要用于验证Google JWT是否有效,是否未受任何恶意代码的影响。

在进入C#为我的应用程序编写代码之前,我一直试图使用OpenSSL对二进制Base64解码段进行解码,但我无法使用谷歌的公共证书对内容进行解码或验证。

关于C#和Google身份验证,有什么像样的文档吗?我所能找到的只是使用DotNetOpenAuth或其他库的示例。

了解Google OAuth2的JWT令牌

如果您有一个Pluralsight帐户,Dominick Baier有一门优秀的课程,其中有一节介绍了这一点(在"JWT结构和格式"部分)。他们有10天的免费试用期,如果你愿意,你可以使用。

前两段只是Base64编码的明文。有那么多;使用JavaScriptSerializer很容易解码和解析。我所关注的是第三部分,据我所知,它需要用于验证Google JWT是否有效,是否未受任何恶意代码的影响。

根据Dominick的说法,要获得第三个片段,您需要对前两个片段进行base-64编码,将它们与句点字符连接,然后运行标头(位于第一个片段中)的alg元素中指定的签名算法。然后,以64为基数计算结果,得到第三段,也用句点分隔。

但我应该指出,即使是谷歌在主要文档中也说:

这种交互机制要求应用程序创建JSON Web令牌(JWT)并对其进行加密签名。强烈鼓励开发人员使用库来执行这些任务。在不使用抽象令牌创建和签名的库的情况下编写此代码很容易出现错误,这些错误可能会严重影响应用程序的安全性。

由于DotNetOpenAuth已经做到了这一点,这可能是最好的方法。如果你正在寻找一个可以与DotNetOpenAuth一起使用的GoogleOAuth2实现,你可以试试我的。它在Nuget上已经有几千次下载了,所以你并不孤单。

关于DNOA没有得到维护,我相信你指的是Andrew Arnott决定辞去首席开发人员的职务。这是真的,我们祝愿他一切顺利。但这并不意味着DNOA根本不受支持或维护。这只是意味着它得到了社区的支持,而不是个人或公司的支持。您应该能够在StackOverflow或DNOA谷歌小组上继续获得帮助和支持。

遵循OAuth 2的主要文档:https://developers.google.com/accounts/docs/OAuth2

如果您需要好的示例,请尝试查找Java示例,它们可能会有所帮助,因为语言相对接近。