我正在使用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中。
答案 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
参数,或者参数值与原始请求不同,则服务器必须拒绝访问令牌请求。