> 文档中心 > 《oauth2实战》code值的防护

《oauth2实战》code值的防护

  1. 我们之前说过前端不能直接拿token,会泄露。因此给前端一个code值,code的保护做好了就是code被泄露,也不会导致token被泄露。
  2. 那么code怎么做保护呢?            第一,前端必须接受指定应用的code,不能乱接受code。以微信登录举例子,这个code必须是微信给的,不能是别的不知名的第三方给的,不能随便一个人给你code你都要。     那就需要验证微信的身份了,怎么验证呢?第一次重定向到微信的时候带上一个state。微信得到这个state回调前端的时候把这个state带回来,这样state只有微信和前端知道,第三方是不知道的。我们值需要验证state对不对,不对说明是第三方给的不能用。这样就确保这个code值是微信给的,我们能用。                 这个值是一个很长的随机数,很难被猜到或者蒙对,被猜到的几率最好是2的负160次方,也就是无限接近0。                 第二,code的有效期很短,建议30s。就算别人拿到code了,但是有效期都过了也没用。比如我们在图书馆的电子阅览区,用的是公共的电脑。我们登录了微信之后,下机人走了。后面的人来了之后会在浏览器的历史记录里面看到微信给前端的code值,他如果使用这个code值写代码获取token的话就可以获取用户信息了。所以code有效期只有30s,后面的人来了用code有效期早就过了,没用了。             如果别人在30s之内就看到你的code了怎么办?那他不就获取了token了吗?                  第三,同一个code只能被使用一次,不能被使用第二次。在30s之内,一个code正常来讲只会被使用一次,如果出现使用两次的情况,那么微信就可以认为code存在被泄露的风险了。那么使用这个code所生成的token会立刻失效掉,别人就算得到token也没用了。

总结一下,黑客如果想获取用户信息的话。需要想办法蒙对state,才能让前端给后台发请求去获取token。就是state蒙对了,黑客害的同时间蒙对code,不然假的code在微信中是不存在的,获取不到token。

就算不用蒙state,直接从图书馆的电脑上面获取了有用的code。code也早都失效了,就是没有失效,一个code也只能被使用一次,黑客也得不到token。最多使用户的token失效。就算黑客比用户早用code,那么他得到token之后用户也会使用code,用户一用code会导致黑客的token失效,黑客也得不到用户信息。