【问题标题】:OAuth Implicit flow Access Token expires every hourOAuth 隐式流访问令牌每小时过期一次
【发布时间】:2017-11-09 09:00:40
【问题描述】:

我在使用 Google 助理的 OAuth 隐式流程时遇到问题。 我设法设置了一个 OAuth 服务器并让它工作。流程如下:

用户被重定向到我的端点,使用 Google 帐户进行身份验证,并使用访问令牌和结果代码=SUCCES 将其发送回智能助理。

在我的完整版本中,我通过向 https://www.googleapis.com/plus/v1/people/me?access_token=access_token 发出 https 请求来获取用户的电子邮件地址。

然后我在我的数据库中找到匹配的用户并将访问令牌添加到该用户的数据库中。

下次用户登录时,我会检查访问令牌并用他们的名字问候用户。

现在的问题是,根据文档,这是隐式流应该有一个永不过期的访问令牌:

注意:Google 要求使用隐式颁发的访问令牌 流永不过期,所以你不需要记录一个授权时间 访问令牌,就像使用其他 OAuth 2.0 流程一样。

但 Google 助理强制我每小时重新验证一次,这意味着访问令牌确实过期了。

我的问题是:这个流程是正确的还是我遗漏了什么?我的 OAuth 端点有什么地方做错了吗?

我的端点基于https://developers.google.com/identity/protocols/OAuth2UserAgent

<html>

  <head>
    <script src="https://apis.google.com/js/platform.js" async defer></script>
    <meta name="google-signin-client_id" content="CLIENT_ID">
  </head>

  <body>
    <script>
      var YOUR_CLIENT_ID = 'CLIENT_ID';

    function oauth2SignIn() {
        // Google's OAuth 2.0 endpoint for requesting an access token
        var oauth2Endpoint = 'https://accounts.google.com/o/oauth2/v2/auth';

        // Create element to open OAuth 2.0 endpoint in new window.
        var form = document.createElement('form');
        form.setAttribute('method', 'GET'); // Send as a GET request.
        form.setAttribute('action', oauth2Endpoint);

        //Get the state and redirect_uri parameters from the request
        var searchParams = new URLSearchParams(window.location.search);
        var state = searchParams.get("state");
        var redirect_uri = searchParams.get("redirect_uri");
        //var client_id = searchParams.get("client_id");

        // Parameters to pass to OAuth 2.0 endpoint.
        var params = {
          'client_id': YOUR_CLIENT_ID,
          'redirect_uri': redirect_uri,
          'scope': 'email',
          'state': state,
          'response_type': 'token',
          'include_granted_scopes': 'true'
        };

        // Add form parameters as hidden input values.
        for (var p in params) {
          var input = document.createElement('input');
          input.setAttribute('type', 'hidden');
          input.setAttribute('name', p);
          input.setAttribute('value', params[p]);
          form.appendChild(input);
        }

        // Add form to page and submit it to open the OAuth 2.0 endpoint.
        document.body.appendChild(form);
        form.submit();
      }
  oauth2SignIn();
    </script>
  </body>

  </html>

【问题讨论】:

    标签: google-oauth actions-on-google google-assistant-sdk api-ai


    【解决方案1】:

    听起来您正在做的是让用户登录您的页面,并使用它从 Google 服务获取身份验证令牌。然后,您将其转过来并将其传回给 Google 助理,并将其称为身份流。

    虽然很聪明 - 这不是身份流程。

    这是您使用身份验证代码流向 Google 验证用户身份,然后将此令牌返回给 Google 并假装这是身份流令牌。但是,由于您使用的是身份验证代码流,因此您取回的身份验证令牌会在一小时后过期。 (您可以在从 Google 返回的信息中查看生命周期。)

    如果您尝试进行帐户关联而不自己管理任何内容,则需要实际实施一个 OAuth 服务器,该服务器代理从 Google 助理到 Google 的 Auth Code Flow 请求以及从 Google 返回到 Google 助理的回复。虽然可行,但可能在 violation of their policy 中,并且通常不建议这样做。

    更新以解决您评论中的一些问题/问题。

    使用 Google Auth 端点也不会存储会话,因此您仍然需要每小时重新进行身份验证

    由于 Google 身份验证端点使用身份验证代码流,您可以使用offline 模式来请求刷新令牌。然后,当授权令牌过期时,您可以使用刷新令牌获取新的授权令牌。所以你仍然有一个长期的访问授权,并且可以获得短期令牌来做你需要的工作。

    但是,试图将其硬塞到身份流中是行不通的。 (即使是这样,这也是一个非常糟糕的主意。)

    您能否解释一下如何为隐式流创建端点?

    除了您的 OAuth 服务器代码在 Google 助理文档中可以做什么的 step-by-step description 之外,我不确定您需要什么澄清。您的 OAuth 服务器基本上只需要:

    • 能够拥有一个用户:
      • 连接到 HTTPS URL
      • 进行身份验证
      • 授权 Google 助理代表他们联系您的服务
    • 通过使用参数中的代码将用户重定向到 Google 的 URL 来返回代码

    并且 Action webhook 需要能够:

    • 接受此代码作为 Google 助理请求的一部分并
    • 通过此代码找出用户是谁。 (即 - 将代码映射到您系统中的用户帐户。)

    您可以通过多种方式完成所有这些操作。 OAuth 服务器和 Action 可以在同一台服务器上或分开,但它们至少需要就该代码是什么以及如何映射到您的用户帐户达成某种协议。

    如果您的主要需求是代表您的用户访问 Google API - 那么您拥有的用户帐户可能会存储 用来访问 Google 服务器的 OAuth 令牌。但您应该从逻辑上将其与 Google 助理用来访问您的服务器的代码分开。

    (顺便说一句,这些步骤是针对身份流程的。身份验证代码流程还有几个步骤,但基本原理是相似的。尤其是在操作方面。)

    【讨论】:

    • 感谢您的回复。这似乎是一个有趣的解决方法,但使用 Google Auth 端点也不会存储会话,因此您仍然必须每小时重新进行身份验证。另外,我并不是不想自己管理用户信息和会话,我只是不知道该怎么做。到目前为止,我已经看到了几乎所有关于 OAuth 的与助手相关的文档,但我仍然无法弄清楚如何正确实现 OAuth 服务器。您能否就如何为隐式流创建端点提供一些说明?
    • 希望我已经提供了一些澄清,但如果您仍有疑问,则需要一些进一步的细节。
    • 有趣的是,由于我的应用程序已部署并存在于助手商店中,因此用户不再退出登录。就好像商店负责会话一样。
    猜你喜欢
    • 2018-12-23
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 2021-06-14
    • 2018-02-11
    • 1970-01-01
    相关资源
    最近更新 更多