2

我正在將我的iOS應用程序從Cordova遷移到React-Native。我有一個App Engine後端,並在應用程序中使用Google身份驗證。隨着科爾多瓦用戶將只需登錄自己的谷歌帳戶使用網頁視圖,這將下降一個cookie,然後他們可以訪問他們的數據如下:Google身份驗證後沒有攜帶身份驗證cookie的React-Native網絡請求

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) 
     } 
    }); 
} 

與之反應本地的,我使用的是https://github.com/apptailor/react-native-google-signin插件。在auth的工作原理如下:

  1. 用戶點擊身份驗證與谷歌鏈接
  2. Safari瀏覽器打開了
  3. 用戶驗證
  4. 返回到我的應用程序

,並在下面的函數被調用

const user = GoogleSignin.currentUser(); 

用戶對象提供ided。

然而,似乎沒有身份驗證cookie被存儲,以便後續的請求到App Engine後端不承認用戶如登錄,使用下面的RN網絡請求

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後端的用戶身份?

回答

1

正如有人在Facebook RN group中所述,您可以使用react-native-cookie庫來處理此問題。但是,我真的認爲您應該重新考慮使用基於cookie的身份驗證,並使用基於令牌的身份驗證。

基於Cookie的身份驗證實際上只適用於Web應用程序。這對於Cordova應用程序來說很好,因爲整個應用程序都在WebView中,但是,在使用React Native時,您需要更改對應用程序的看法。您應該將RN應用程序視爲用JS編寫的本地應用程序。

GoogleSignin.currentUser()返回的對象包含serverAuthCode參數,假設您正確配置它(see the note here)。您可以使用它來獲取用戶的訪問令牌。這是一些未經測試的代碼,它可以這樣做:

function getTokenForUser(user) { 
    var formData = new FormData(); 
    formData.set("grant_type", "authorization_code"); 
    formData.set("client_id", "{clientId}"); 
    formData.set("client_secret", "{clientSecret}"); 
    formData.set("redirect_uri",""); 
    formData.set("code", user.serverAuthCode); 

    return fetch('https://www.googleapis.com/oauth2/v4/token', { 
    method: 'POST', 
    body: formData, 
    }).then((response) => response.json()) 
} 

這將返回一個以令牌對象解析的promise。例如:

{ 
    "expires_in": 3600, 
    "token_type": "Bearer", 
    "refresh_token": "...", 
    "id_token": "...", 
    "access_token": "..." 
} 

然後,您可以使用它來提出您需要的請求。

1

對不起,我無法發表評論。 (我發佈在Facebook RN group

想要感謝丹的回答,幫了很多! 我也會發布更新,如果它的工作。