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

时间:2015-08-13 10:35:40

标签: 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 + "&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);

在服务器端,我得到的状态包含我的数据库的user_id和授权代码。 现在我想交换访问令牌的授权码(和续订令牌)。这将是带有重定向URI的HTTP请求,不包含任何状态参数。

问题在于,当我得到这些内容时,我需要将它们存储在我的数据库中的用户身上,但我没有办法检查回调的用户。

我能想到的最好的方法是使用令牌来查询它所属的谷歌用户的身份,但这仍然无法帮助我找到数据库中的用户。

任何人都可以帮我解决这个问题吗?必须有一些方法可以做。我不想使用客户端库,因为稍后当我需要创建观察者时,PHP客户端库不会将其包含在日历API中。

1 个答案:

答案 0 :(得分:1)

简答

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

更详细的答案

根据OAuth 2.0规范文档(RFC 6749)的section 4.1.4,对访问令牌请求的响应应该是" HTTP / 1.1 200 OK"。

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

这与授权请求不同,授权请求应该导致" HTTP / 1.1 302 Found" (重定向)。请参阅section 4.1.2

那么为什么需要redirect_uri参数?

根据section 4.1.3,服务器必须:

  • 确保" redirect_uri"如果" redirect_uri"参数包含在初始授权请求中,如第4.1.1节所述,如果包含,请确保它们的值相同。

换句话说,redirect_uri充当一种机密必须用来验证访问令牌请求的机密或密码。如果客户端无法提供redirect_uri参数,或者参数值与原始请求不同,则服务器必须拒绝访问令牌请求。