Ios 在Google身份验证未携带身份验证cookie后响应本机网络请求
我正在将我的iOS应用程序从Cordova迁移到React Native。我有一个应用程序引擎后端,并在应用程序中使用谷歌认证。使用cordova,用户只需使用webview登录到他们的Google帐户,这将删除一个cookie,然后他们可以按如下方式访问他们的数据:Ios 在Google身份验证未携带身份验证cookie后响应本机网络请求,ios,google-app-engine,react-native,google-oauth,google-authentication,Ios,Google App Engine,React Native,Google Oauth,Google Authentication,我正在将我的iOS应用程序从Cordova迁移到React Native。我有一个应用程序引擎后端,并在应用程序中使用谷歌认证。使用cordova,用户只需使用webview登录到他们的Google帐户,这将删除一个cookie,然后他们可以按如下方式访问他们的数据: function getSomeResource(callback_method) { $.ajax({ type: "GET", url: 'https://myapp.appspot.com' +
function getSomeResource(callback_method)
{
$.ajax({
type: "GET",
url: 'https://myapp.appspot.com' + '/endpoint',
dataType: "jsonp",
cache: true,
xhrFields: {
withCredentials: true
},
success: function(result)
{
callback_method(result);
},
error: function(fail)
{
console.log(fail)
}
});
}
对于React Native,我正在使用插件。auth的工作原理如下:
const user = GoogleSignin.currentUser();
提供了一个用户对象
但是,似乎没有存储身份验证cookie,因此在使用以下RN网络请求时,对App Engine后端的后续请求不会识别用户已登录
fetch('https://myapp.appspot.com' + '/endpoint', {
method: 'GET',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
'Access-Control-Allow-Credentials' : 'true'
}
})
.then((response) => response.text())
.then((responseText) => {
var responseObject = JSON.parse(responseText);
console.log(responseObject);
});
问题是我是否有办法获得一个cookie(就像我们使用Cordova那样),这样我就可以使用它来根据GAE后端对用户进行身份验证?正如有人在中所说,您可以使用库来处理这个问题。然而,我真的认为您应该重新考虑使用基于cookie的身份验证,而应该使用基于令牌的身份验证
基于Cookie的身份验证实际上只适用于web应用程序。这对于Cordova应用程序来说很好,因为整个应用程序都在网络视图中,但是,在使用React Native时,您需要改变您对应用程序的看法。您应该将RN应用程序视为有效的原生应用程序,用JS编写
GoogleSignin.currentUser()
返回的对象包含一个serverAuthCode
参数,前提是配置正确()。您可以使用它为用户获取访问令牌。以下是一些未经测试的代码:
函数getTokenforser(用户){
var formData=new formData();
formData.set(“授权类型”、“授权代码”);
set(“client_id”,“{clientId}”);
set(“client_secret”,“{clientSecret}”);
formData.set(“redirect_uri”和“”);
formData.set(“代码”,user.serverAuthCode);
返回获取('https://www.googleapis.com/oauth2/v4/token', {
方法:“POST”,
正文:formData,
}).then((response)=>response.json())
}
这将返回一个与令牌对象解析的承诺。例如:
{
“expires_in”:3600,
“令牌类型”:“承载者”,
“刷新令牌”:“…”,
“id_令牌”:“…”,
“访问令牌”:“…”
}
然后,您可以使用此功能提出所需的请求。对不起,我无法发表评论。(我把这个贴在了网上) 想感谢丹的回答,帮了大忙! 如果有用的话,我也会发布更新