菜鸟教程小白 发表于 2022-12-12 19:30:55

ios - Google 身份验证后的 React-Native 网络请求未携带身份验证 cookie


                                            <p><p>我正在将我的 iOS 应用从 Cordova 迁移到 React-Native。我有一个 App Engine 后端并在应用程序中使用 Google 身份验证。使用cordova,用户只需使用webview登录他们的谷歌账户,这将删除一个cookie,然后他们可以访问他们的数据,如下所示:</p>

<pre><code>function getSomeResource(callback_method)
{
   $.ajax({
    type: &#34;GET&#34;,
    url: &#39;https://myapp.appspot.com&#39; + &#39;/endpoint&#39;,
    dataType: &#34;jsonp&#34;,
    cache: true,
    xhrFields: {
      withCredentials: true
    },
    success: function(result)
      {
            callback_method(result);
      },
    error: function(fail)
      {
         console.log(fail)
      }
    });
}
</code></pre>

<p>对于 React-Native,我使用的是 <a href="https://github.com/apptailor/react-native-google-signin" rel="noreferrer noopener nofollow">https://github.com/apptailor/react-native-google-signin</a>插入。身份验证的工作原理如下:</p>

<ol>
<li>用户使用谷歌链接点击授权</li>
<li>Safari 打开</li>
<li>用户验证</li>
<li>返回我的应用</li>
</ol>

<p>当调用以下函数时</p>

<pre><code>const user = GoogleSignin.currentUser();
</code></pre>

<p>提供了一个用户对象。 </p>

<p>但是,当使用以下 RN 网络请求时,似乎没有存储任何身份验证 cookie,因此对 App Engine 后端的后续请求无法识别用户已登录</p>

<pre><code>fetch(&#39;https://myapp.appspot.com&#39; + &#39;/endpoint&#39;, {
method: &#39;GET&#39;,
headers: {
    &#39;Accept&#39;: &#39;application/json&#39;,
    &#39;Content-Type&#39;: &#39;application/json&#39;,
    &#39;Access-Control-Allow-Credentials&#39; : &#39;true&#39;
}
})
.then((response) =&gt; response.text())
.then((responseText) =&gt; {
var responseObject = JSON.parse(responseText);
console.log(responseObject);
});
</code></pre>

<p>问题是我是否有任何方法可以获取 cookie(就像我们使用 Cordova 所做的那样),以便我可以使用它来针对 GAE 后端对用户进行身份验证?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>正如某人在 <a href="https://www.facebook.com/groups/react.native.community/permalink/768832576585656/?comment_id=769453916523522&amp;comment_tracking=%7B%22tn%22%3A%22R%22%7D" rel="noreferrer noopener nofollow">Facebook RN group</a> 中所说的那样,您可以使用 <a href="https://github.com/joeferraro/react-native-cookies" rel="noreferrer noopener nofollow">react-native-cookie</a>库来处理这个。但是,我真的认为您应该重新考虑使用基于 cookie 的身份验证,并改用基于 token 的身份验证。 </p>

<p>基于 Cookie 的身份验证实际上只适用于 Web 应用程序。这对于 Cordova 应用程序来说很好,因为整个应用程序都在 WebView 中,但是,在使用 React Native 时,您需要改变对应用程序的看法。您应该将 RN 应用视为有效的原生应用,用 JS 编写。</p>

<p><code>GoogleSignin.currentUser()</code> 返回的对象包含一个 <code>serverAuthCode</code> 参数,假设您配置正确 (<a href="https://github.com/devfd/react-native-google-signin#user" rel="noreferrer noopener nofollow">see the note here</a>)。您可以使用它来获取用户的访问 token 。这是一些未经测试的代码:</p>

<pre class="lang-js prettyprint-override"><code>function getTokenForUser(user) {
var formData = new FormData();
formData.set(&#34;grant_type&#34;, &#34;authorization_code&#34;);
formData.set(&#34;client_id&#34;, &#34;{clientId}&#34;);
formData.set(&#34;client_secret&#34;, &#34;{clientSecret}&#34;);
formData.set(&#34;redirect_uri&#34;,&#34;&#34;);
formData.set(&#34;code&#34;, user.serverAuthCode);

return fetch(&#39;https://www.googleapis.com/oauth2/v4/token&#39;, {
    method: &#39;POST&#39;,
    body: formData,
}).then((response) =&gt; response.json())
}
</code></pre>

<p>这将返回一个用 token 对象解析的 promise 。示例:</p>

<pre class="lang-json prettyprint-override"><code>{
&#34;expires_in&#34;: 3600,
&#34;token_type&#34;: &#34;Bearer&#34;,
&#34;refresh_token&#34;: &#34;...&#34;,
&#34;id_token&#34;: &#34;...&#34;,
&#34;access_token&#34;: &#34;...&#34;
}
</code></pre>

<p>然后您可以使用它来发出您需要的请求。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - Google 身份验证后的 React-Native 网络请求未携带身份验证 cookie,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/36790947/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/36790947/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - Google 身份验证后的 React-Native 网络请求未携带身份验证 cookie