【问题标题】:Is it possible to make "redirect_url" NOT open in the browser window with Google OAuth2?是否可以使用 Google OAuth2 在浏览器窗口中打开“redirect_url”?
【发布时间】:2017-07-25 14:44:45
【问题描述】:

我正在编写一个需要使用OAuth2 Protocol 进行身份验证的应用程序。我已经设法使用Web Server App authentication mechanism,它运行良好,唯一的问题是我在程序本身中处理redirect_url,我不希望浏览器在新标签中发出请求。

如果可能,理想的解决方案是谷歌服务器直接向我发送请求,或者打开和关闭浏览器选项卡/窗口。

也许这种方法不是最合适的,如果是这样,请告诉我如何更好地做到这一点。

【问题讨论】:

  • 你真正想做什么?通常重定向不会打开新选项卡(尽管它会发出新请求)。
  • @TatsuyukiIshi 问题是,通过这种身份验证,我需要在浏览器中打开一个同意窗口,然后同意窗口重定向到给定的 url,当然,它确实执行了请求。我的程序确实处理了请求并且没问题,但是浏览器选项卡已打开并且没有什么可做的,因为不可能用 javascript 关闭浏览器选项卡,它不是由 javascript 打开的。我的临时解决方案是返回一些 HTML,告诉用户程序收到了代码,但如果我可以直接显示该消息会更简洁。
  • 你如何首先打开浏览器窗口?例如,如果它是一个桌面应用程序,它打开浏览器只是为了获得用户的同意,它可以通过向浏览器窗口发送消息来模拟用户的操作(包括关闭窗口)。如果是web应用,可以用javascript(window.open())打开同意,这样就可以用window.close()等关闭打开的窗口。
  • 真正的应用程序没有用户界面,但是它会通过文件管理器与用户交互。我在想类似的事情。我通过xdg-open $url打开浏览器窗口,它是一个linux程序,所以它是故意不可移植的,或者至少目前是这样。

标签: google-api oauth-2.0 google-oauth


【解决方案1】:

公平警告,没有像这样使用过 oAuth,但我有一个想法:

您不能在弹出窗口中使用 window.open() 打开 oauth 请求吗?
然后使用window.opener 获取弹出窗口的父级就很容易了。

OAuth 验证后,您可以使用以下命令刷新父级: window.opener.location.reload();

然后您可以简单地使用window.close() 关闭弹出窗口。

这样就不会打开新标签页,您的应用程序将保持活动标签页。

【讨论】:

    【解决方案2】:

    是的,我实际上是在使用 Web 浏览器控件在我的 .Net 应用程序中这样做的。您已标记此 Google Oauth,因此我假设您正在使用 Google 的身份验证服务器执行此操作。我怀疑您正在使用 Google 的客户端库之一,默认情况下该库是为了在新的浏览器窗口中打开它而构建的。例如,Google .Net 客户端库就是为此而设计的。

    该技巧可能要求您使用不需要重定向 URI 的本机或其他类型的凭据,而不是使用 Web 凭据。这些凭据通常用于已安装的应用程序,但也可用于 Web。使用网络凭据可能可以做到这一点,但我认为这将在一定程度上取决于您到底在做什么。

    Google Oauth2 流程:

    流程的第一步是创建 URL 以供用户进行身份验证。这是一个网页,您无法更改它。因此,您的应用程序需要能够向用户显示网页。

    https://accounts.google.com/o/oauth2/auth?client_id={clientid}.apps.googleusercontent.com&redirect_uri=urn:ietf:wg:oauth:2.0:oob&scope=https://www.googleapis.com/auth/analytics.readonly&response_type=code  
    

    通过提供 urn:ietf:wg:oauth:2.0:oob 您基本上是在告诉身份验证服务器将代码返回到您发送它的位置。

    代码已返回给您,您需要更换它。此调用是 HTTP POST。

    https://accounts.google.com/o/oauth2/token
    code=4/X9lG6uWd8-MMJPElWggHZRzyFKtp.QubAT_P-GEwePvB8fYmgkJzntDnaiAI&client_id={ClientId}.apps.googleusercontent.com&client_secret={ClientSecret}&redirect_uri=urn:ietf:wg:oauth:2.0:oob&grant_type=authorization_code
    

    回复

    {
    "access_token" : "ya29.1.AADtN_VSBMC2Ga2lhxsTKjVQ_ROco8VbD6h01aj4PcKHLm6qvHbNtn-_BIzXMw",
    "token_type" : "Bearer",
    "expires_in" : 3600,
    "refresh_token" : "1/J-3zPA8XR1o_cXebV9sDKn_f5MTqaFhKFxH-3PUPiJ4"
    }
    

    现在您有了一个刷新令牌和一个访问令牌。您可以使用另一个 HTTP POst 调用刷新您的访问令牌。

    https://accounts.google.com/o/oauth2/token
    client_id={ClientId}.apps.googleusercontent.com&client_secret={ClientSecret}&refresh_token=1/ffYmfI0sjR54Ft9oupubLzrJhD1hZS5tWQcyAvNECCA&grant_type=refresh_token
    

    回应

    {
    "access_token" : "ya29.1.AADtN_XK16As2ZHlScqOxGtntIlevNcasMSPwGiE3pe5ANZfrmJTcsI3ZtAjv4sDrPDRnQ",
    "token_type" : "Bearer",
    "expires_in" : 3600
    }
    

    因此,只要您可以将 auth URL 嵌入到您的应用程序中,您就可以自己获取它。您不需要重定向 URI。我在google 3 legged oauth2上的教程

    【讨论】:

    • 不知道是不是涉及浏览器!如果不是,那么我需要提供一些方法来在不使用浏览器的情况下向用户显示页面,我已经在考虑这一点,但就我而言,这很困难。因为我无法访问网络浏览器控件,所以我需要自己编写一个迷你网络浏览器,这可能很简单,也可能非常困难,因为我认为它需要执行一些js。
    • 另外,我知道代码并用access_token 交换它,我的应用程序确实验证正确。
    • 没有办法避免必须通过该网页执行初始同意。但是是的,您可以创建自己的迷你浏览器。
    【解决方案3】:

    由于您已经在使用非便携式 xdg-open,您可能可以使用另一个外部工具 (xdotool) 并使用它来模拟用户击键:

    xdotool search --onlyvisible --class "Chrome" windowfocus key 'ctrl+w'
    

    这会将ctrl+w(关闭标签)发送到可见的chrome实例

    请记住,可能会打开多个浏览器窗口。

    【讨论】:

    • 什么是xdotool?像xdg-open这样的标准吗?
    • Xdotool。它不像 xdg-open 那样广泛,但可以作为大多数主要 Linux 发行版的软件包提供。
    猜你喜欢
    • 2023-02-20
    • 2015-04-02
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    相关资源
    最近更新 更多