我正在开发一个React Native应用,该应用需要对建立在Django REST框架上的RESTful API进行API调用。为了进行身份验证,我们的API有一个登录终结点,该终结点将在标头中发送回sessionid cookie,然后在将来的请求标头中将其发送回以接收特定于用户的信息。
在Android上,这可以按预期工作,但是在iOS上,成功登录服务器后发送完全相同的请求会由于用户未通过身份验证而引发错误。
这些测试中唯一值得注意的区别是,在iOS上,服务器在进行第二次调用(使用有效的sessionid发送)后返回了一个空的sessionid:
"headers": Object {
...
"Cookie": "sessionid=\"\"; ..."
}
我们最近更新了Expo SDK 36,其中包括对React Native 0.61的更新。在此更新之前,Android和iOS版本均能按预期工作,但是我不能确定这是直接原因,因为在更新之前,圣诞节后大约2星期才休息,然后才发现问题。
此代码段显示了发出请求时如何获取cookie(当前避免使用额外的库来简化过程):
response = await fetch(requestConfig.url,requestConfig)
.then(result => {
let cookies = result.headers.get('set-cookie');
if (cookies != null) {
let sessionId = cookies.split(',').find(element => element.match(/sessionid/))!.substring(10,42);
sessionId && (this.sessionId = sessionId);
}
return result;
});
我尝试将credentials: 'include',
添加到请求中,但没有成功。
在发出经过身份验证的请求时,请求本身在两个平台上均如下所示:
Object {
"body": "<JSON_Request>","headers": Object {
"accept": "application/json","Content-type": "application/json","Cookie": "sessionid=<sessionID>",},"method": "POST","url": "<API_URL>",}
如果有人遇到React Native 0.61的类似问题,或者发现我做错了什么,我将不胜感激!