引言
- 事件起源
- 技术方案
- 浏览器cookie问题
- ios端safari浏览器问题
- 微信网页授权问题
- 最终技术实现
1、需求起源于业务希望我司平台提供一个js sdk包供第3方授权使用
细节:
- 调起时需要弹框调起(说是体验好)
- 需要支持手机浏览器和微信浏览器
- 领导呢说要快快弄完
- 心里mmp
2、沟通确认技术方案
- 1、前端js直接调用后台接口(不安全,容易暴露接口被刷,其次获取不到用户是否登录过,每次都需要填写手机号登录) ×
- 2、参考Facebook js登录sdk,调起一个iframe,iframe里嵌套php页面,来处理授权以及登录逻辑(需要iframe与页面通信)
- 3、最终选择了方案2
3、iframe打开3方链接cookie写入失效问题
主要原因: 通俗一点就是chrome升级了,会默认cookie加一个SameSite=Lax的属性(为了防止减少CSRF攻击)
SameSite支持的3个值
- Strict
- Lax
- None
请求类型 | 示例 | 正常情况 | Lax |
---|---|---|---|
链接 | 可以 | 可以 | |
预加载 | 可以 | 可以 | |
GET 表单 | 可以 | 可以 | |
POST 表单 | 可以 | 不可以 | |
iframe | 可以 | 不可以 | |
AJAX | $.get("...") | 可以 | 不可以 |
Image | 可以 | 不可以 |
解决方案:php7.3以后setcookie支持设置SameSite的值,但是很可以我们是7.2,版本不会轻易的升级, 只能自己复写cookie方法
简易通过header头设置
function setnewcookie($name, $value, $options){
$expire = isset($options['expires']) ? $options['expires'] : 0;
$path = isset($options['path']) ? $options['path'] : '';
$domain = isset($options['domain']) ? $options['domain'] : '';
$secure = isset($options['secure']) ? boolval($options['secure']) : false;
$httponly = isset($options['httponly']) ? boolval($options['httponly']) : false;
$samesite = isset($options['samesite']) ? $options['samesite'] : '';
$expire = 0 < $expire ? (int) $expire : 0;
$date = gmdate('D, d-M-Y H:i:s T',$expire);
$maxAge = ($expire-time()>0)?$expire-time():0;
$path = empty($path) ? '/' : $path;
$cookie = sprintf("Set-Cookie:%s=%s;expires=%s; Max-Age=%d;path=%s;domain=%s;secure=%d;HttpOnly=%d;SameSite=%s", urlencode($name),urlencode($value), $date,$maxAge,$path, $domain, $secure, $httponly, $samesite);
//dump($cookie);exit;
header($cookie);
}
github找到一个封装好的类
https://github.com/ovunctukenmez/SameSiteCookieSetter
iframe 访问cookie写入问题解决
4、ios端自带浏览器的坑
- 在上一个cookie的坑搞定后,又出现新的问题,ios端 safari突然说cookie也写入不了,用户只能在登录页
- 上网搜索了很多资料,是苹果的幺蛾子(mmp)
- 解决方案:在老一点的版本,如果第3方先有任意cookie的情况下,才可以写入(估计是漏洞),最新版本已不支持这种方式,除非关闭safarir浏览器设置的阻止跨网站跟踪
- 和老板好一顿说,表示臣妾做不了后可以忽略
5、微信网页授权问题
- 一个问题后边总会跟着另外一个。微信网页授权也出现问题
- 安卓中不可以加载iframe,直接就是白屏
- ios端直接就跳页面了
- 只能找领导沟通
- 相关文章 微信网页授权iframe打不开问题
6、最终解决方案
全部走浏览器的授权
7、可能会有用的方案
如果ios发现不能写cookie的话,可以先试试在第3方写入一个cookie之后
结尾
通过这次爬坑之路,学习到了不少了新知识,开发之路且珍惜