了解Google OAuth2的JWT令牌

时间:2013-08-19 16:47:16

标签: c# asp.net google-oauth

ETA 2:

我能够使用公开可用的文档和我的SO的密码学知识,以及MSDN上处理OAuth2实现最重要部分的方便代码示例来验证所有这些 - 验证签名JWT的完整性。

I detailed in a three-part series on my blog.

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

问题是DotNetOpenAuth尚未在中更新,我不建议使用老化的库进行身份验证,因为无法确定哪些安全漏洞可能未修补。

C#中的验证组件使用了RSAPKCS1SignatureDeformatter.VerifySignature,并且t he sample code in the MSDN article on this method几乎是逐字逐句的,您需要使用它来确保签名的JWT有效且未被恶意第三方拦截。

ETA:

我在Stack Overflow上发布此消息是因为Google使用google-oauth2标记专门指导用户使用Stack Overflow来获取有关Google OAuth2 API的问题,帮助和支持。所有Google OAuth2支持的Stack Overflow迁移已于2013年3月实施,如本公告所示:

https://groups.google.com/forum/#!forum/oauth2-dev

情景:

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

经过很长一段时间阅读Google的OAuth2文档并搞清楚JWT规范,我已经走得很远了。但是,我正在努力确保一旦用户允许我的应用程序使用其帐户,我就会理解Google返回的Base64编码JWT的第三部分。

前两个段只是Base64编码的明文。得到那么多;这很容易解码和JavaScriptSerializer解析。我坚持的是第三部分,根据我的理解,它需要用来验证Google JWT是否有效并且不受任何恶意代码的影响。

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

是否有关于C#和Google身份验证的体面文档?我所能找到的只是使用DotNetOpenAuth或其他库的例子。

2 个答案:

答案 0 :(得分:2)

如果你有一个Pluralsight帐户,Dominick Baier有一个很好的课程,有a section that covers this(在“JWT结构和格式”部分)。如果您愿意,他们可以免费试用10天。

  

前两个段只是Base64编码的明文。得到那么多;这很容易解码和JavaScriptSerializer解析。我坚持的是第三部分,根据我的理解,它需要用来验证Google JWT是否有效并且不受任何恶意代码的影响。

根据Dominick的说法,为了获得第三个段,你使用base-64编码前两个段,用句点字符连接它们,然后运行标题的alg元素中指定的签名算法(这是第一部分)。然后你得到64结果,你有第三段 - 也用句号分隔。

但我应该指出,即使谷歌说in the main documentation

  

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

由于DotNetOpenAuth已经这样做了,这可能是最好的方法。如果您正在寻找可以与DotNetOpenAuth一起使用的Google OAuth2实现 - 您可以try mine。它已经在Nuget上下载了几千个,所以你并不孤单。

关于DNOA未被维护,我相信你指的是Andrew Arnott's decision to step down as the lead developer。这是事实,我们祝他好。但这并不意味着DNOA根本不受支持或维护。它只是意味着它得到社区的支持,而不是个人或公司。您应该可以在StackOverflow上或DNOA Google Group上继续获得帮助和支持。

答案 1 :(得分:0)

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

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