无需默认Google弹出窗口即可从Google登录获取Jwt有效载荷

问题描述 投票:0回答:1

我正在尝试从Web应用程序(asp.net vb.net)使用Google登录。遵循Google提供的教程,并使用适用于.NET的Google API库,这是一项简单的任务。https://developers.google.com/identity/sign-in/web/sign-in

现在这种方法的结果是,我在客户端上检查了一个JWT的googleUser.getAuthResponse()。id_token,并使用ajax将其发送到我的服务器端代码以进行验证,并通过Google唯一用户获取有效负载ID和其他信息。

所有这些都发生在同一页面上,由Google提供的弹出式窗口,由其在教程中提供的默认按钮触发。

[我要完成的工作是在没有弹出窗口的情况下获得相同的JWT(id_token),但实际上是在用户单击自定义“使用Google登录”按钮时向Google发出了重定向。

我很难找到的所有示例,甚至是从Google本身,都涉及到更为复杂的交互,在交互中,您需要从服务器获取代码,然后您必须交换临时令牌和刷新令牌,依此类推。虽然他们提供的带有弹出窗口的客户端方法会立即为您提供JWT令牌作为响应,而不是向您提供请求令牌的代码,但您必须先进行验证(我使用带有GoogleJsonWebSignature.ValidateAsync(externalToken的Google .Net API来完成此操作),然后以这种方式获取有效载荷)。

查看弹出窗口中的url,我发现与我发现的所有为令牌交换提供“代码”的示例不同的是那些参数:flowName = GeneralOAuthFlow和response_type = permission%20id_token虽然您发现服务器到服务器事务的示例都包括使用response_type = code

调用Google

我尝试对弹出URL进行一些改动,以使其在新的完整窗口中打开,复制和修改URL,但收效甚微。我已重定向,但没有id_token参数。

任何提示将不胜感激,因为我无法在response_type = permission%20id_token上找到任何文档来查询Google服务。

提前感谢

asp.net jwt single-sign-on google-signin google-api-dotnet-client
1个回答
0
投票

对于任何有兴趣的人...我找到了解决方案。重定向到的网址是:

https://accounts.google.com/o/oauth2/auth?response_type=id_token&redirect_uri= {0}&scope =https://www.googleapis.com/auth/userinfo.emailhttps://www.googleapis.com/auth/userinfo.profile&client_id= {1}&state = {2}

哪里{0}是您服务器上的重定向URL,已在Google控制台中为此client_id注册{1}是您的Google client_id{2}是您要在重定向发生时返回到服务器的一些查询字符串或变量

[有效...它直接带给您可以通过Google.NET APi与GoogleJsonWebSignature.ValidateAsync(id_token)进行验证的id_token,从而获得有效负载(您在Google Api .NET中也具有有效负载类)。

唯一的问题是,当Google使用查询字符串中的id_token返回您的重定向URL时,它使用哈希(URL片段#),因此没有任何内容传递给服务器。

js有一些变通方法,可以获取值并使用ajax发送到服务器,或重定向到同一页面,用?替换哈希值?但这很烦人。我认为Google这样做有严重的安全原因,但从开发人员的角度来看确实很痛苦。而不是所有这些黑客,我采用了更长的方法来请求response_type = code而不是id_token,它返回带有?code = ...]的规范查询字符串

如果有人知道如何在没有url的哈希的情况下获取id_token,那就太好了。

© www.soinside.com 2019 - 2024. All rights reserved.