Javascript Google HTTP/REST OAuth:授权代码请求具有db用户的状态,访问令牌请求没有

Javascript Google HTTP/REST OAuth:授权代码请求具有db用户的状态,访问令牌请求没有,javascript,php,http,google-calendar-api,google-oauth,Javascript,Php,Http,Google Calendar Api,Google Oauth,我正在为Google使用OAuth服务器流。 首先,用户单击一个运行javascript的链接,打开一个弹出窗口,其中URI中有以下请求,这些请求都非常有效: var endpoint = "https://accounts.google.com/o/oauth2/auth"; endpoint = endpoint + "?scope="+encodeURIComponent(googlecalendar.SCOPES); endpoint = endpoint

我正在为Google使用OAuth服务器流。 首先,用户单击一个运行javascript的链接,打开一个弹出窗口,其中URI中有以下请求,这些请求都非常有效:

var endpoint = "https://accounts.google.com/o/oauth2/auth";
        endpoint = endpoint + "?scope="+encodeURIComponent(googlecalendar.SCOPES);
        endpoint = endpoint + "&redirect_uri="+encodeURIComponent("https://myserver/google/");
        endpoint = endpoint + "&response_type=code";
        endpoint = endpoint + "&access_type=offline";
        endpoint = endpoint + "&approval_prompt=force";
        endpoint = endpoint + "&client_id="+encodeURIComponent(googlecalendar.CLIENT_ID);
        endpoint = endpoint + "&state="+encodeURIComponent(googlecalendar.USER_ID);
在服务器端,我获取包含数据库用户id和授权代码的状态。 现在我想用授权代码交换访问令牌(和续订令牌)。这将是一个带有重定向URI的HTTP请求,不包括任何状态参数

问题是,当我得到它们时,我需要将它们存储在数据库中的某个用户上,但我没有任何方法来检查回调是针对哪个用户的

我能想到的最好办法是使用令牌查询谷歌用户的身份,但这仍然不能帮助我在数据库中找到用户

有人能帮我处理这个流程吗?一定有办法。我不想使用客户机库,因为以后当我需要创建观察者时,PHP客户机库不包括日历API的这些。

Short-Answer 尽管存在重定向参数,访问令牌将生成标准200响应,而不是301重定向。根据您发出和处理请求/响应的方式,您可以保留您的状态

更详细的回答 根据OAuth 2.0规范文档(RFC 6749)的定义,对访问令牌请求的响应应该是“HTTP/1.1 200 OK”

换句话说,服务器不会执行重定向,这意味着您可以在同一范围内发出请求并处理响应(在客户端或服务器中,无论您处于何种情况),因此您的数据库用户ID只需要位于本地内存中

这与授权请求不同,授权请求的结果应该是“找到HTTP/1.1 302”(重定向)。看

那么为什么需要
redirect\u uri
参数呢

根据,服务器必须:

  • 如第4.1.1节所述,如果初始授权请求中包含“redirect_uri”参数,请确保“redirect_uri”参数存在,如果包含,请确保其值相同

换句话说,
redirect\u uri
充当一种机密或密码,服务器必须使用它来验证访问令牌请求。如果客户端未能提供
重定向uri
参数,或者参数值与原始请求不同,然后服务器必须拒绝访问令牌请求。

如果有某种方法可以使用授权代码找到google用户,那么我可以使用状态将其链接到我的db,但在将代码交换为令牌后,我不再有方法将db用户链接到续订令牌。似乎我必须使用会话来保持状态。我看不出这有什么问题。当您在提供的返回URL()处接收到授权代码参数(以及带有in-userID的状态参数)时,您必须在同一请求中立即发出令牌请求(我猜),因为授权令牌仅在几秒钟内有效。你有你需要的用户ID aviabele,对吗?问题是当我必须交换它时,我用代码和重定向uri发出一个新的请求。当它返回到另一个重定向uri时,我不知道它是为哪个用户提供的。我能想到的唯一解决方案是在我的应用服务器上执行此操作,并使用会话跟踪用户。我想在我的api服务器上完成这一切,该服务器将监视没有会话状态的推送通知。因为我将要做一个具有相同功能的应用程序,这将使以后的事情变得非常棘手。如果有一个解决方案不涉及使用会话,那么这将是理想的。只有授权请求(第一个)将被重定向