Ios 在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' +

我正在将我的iOS应用程序从Cordova迁移到React Native。我有一个应用程序引擎后端,并在应用程序中使用谷歌认证。使用cordova,用户只需使用webview登录到他们的Google帐户,这将删除一个cookie,然后他们可以按如下方式访问他们的数据:

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的工作原理如下:

  • 用户使用google链接单击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_令牌”:“…”,
    “访问令牌”:“…”
    }
    

    然后,您可以使用此功能提出所需的请求。

    对不起,我无法发表评论。(我把这个贴在了网上)

    想感谢丹的回答,帮了大忙! 如果有用的话,我也会发布更新