4

我正在按照本教程创建一个登录按钮。

https://developers.google.com/+/web/signin/server-side-flow

但我看不到防伪状态如何传递给按钮片段(第 4 步)。

按钮是否应该有像数据状态这样的参数?

整个教程没有提到状态代码是如何从页面传递到谷歌服务器并返回到我的 signInCallback 函数的。

<div id="signinButton">
  <span class="g-signin"
        data-scope="https://www.googleapis.com/auth/plus.login"
        data-clientid="YOUR_CLIENT_ID"
        data-redirecturi="postmessage"
        data-accesstype="offline"
        data-cookiepolicy="single_host_origin"
        data-callback="signInCallback">
  </span>
</div>

然后在第 6 步中,我看不到状态是如何传递给 ajax 服务器调用的。那么这个 if 条件在步骤 7 中是如何工作的呢?

如果 request.args.get('state', '') != session['state']:

感谢您提前提供任何帮助。

4

2 回答 2

7

经过一番摸索,我发现按钮有一个未记录的参数 data-state。一旦我设置它,我可以让它回到我的回调函数。

<div id="signinButton">
  <span class="g-signin"
        data-scope="https://www.googleapis.com/auth/plus.login"
        data-clientid="YOUR_CLIENT_ID"
        data-state="MY_STATE" <!-- The state is sent to Google and back to my callback -->
        data-redirecturi="postmessage"
        data-accesstype="offline"
        data-cookiepolicy="single_host_origin"
        data-callback="signInCallback">
  </span>
</div>
于 2013-05-22T00:43:13.530 回答
0

状态最终成为存储在会话变量中的值。会话通常表示为会话 cookie,它们本身是随机的。会话 cookie 会与 ajax 请求一起自动发送,因此您无需执行任何特定操作。我不确定 PHP 是直接将状态代码放入 cookie 中还是使用会话 cookie 来跟踪会话,但任何一种方式都应该同样有效。防伪代码的全部意义在于确保有人无法对您的服务器进行盲目攻击。

您会注意到这与按钮本身无关。您无需将其发送给 Google,Google 也不想要它。这只是在您的服务器和它显示的页面之间。

于 2013-05-22T00:07:10.707 回答