javascript - Google HTTP/REST OAuth : authorisation code request has state for db user, 访问 token 请求没有

标签 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 和授权代码的状态。 现在我想交换访问 token (和更新 token )的授权码。这将是一个带有重定向 URI 的 HTTP 请求,不包含状态参数。

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

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

谁能帮我解决这个问题?一定有什么办法。我不想使用客户端库,因为稍后当我需要创建观察者时,PHP 客户端库不包括用于日历 API 的这个。

最佳答案

简答

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

更详细的回答

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

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

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

那么为什么需要 redirect_uri 参数呢?

根据 section 4.1.3 ,服务器必须:

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

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

关于javascript - Google HTTP/REST OAuth : authorisation code request has state for db user, 访问 token 请求没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31985800/

相关文章:

javascript - IE8中动态创建选择框选项问题

javascript - 如何允许用户使用此 JQuery 示例关闭幻灯片?

javascript - 将变量传递给 jquery 模态,如何?

javascript - 使用内部有 php 变量的 php 创建 javascript 警报?

php - 无法理解此 MySQL 查询目的

php - 如何检查字符串中是否只有一个 "@"字符?

c - c 中的 RESTful 客户端

触发获取请求时出现 java.lang.IllegalArgumentException : Host name may not be null,

http - RESTful 数据结构模式

javascript - 在我的网站中保存搜索关键字