【问题标题】:How to set cookie in React Native with Expo?如何使用 Expo 在 React Native 中设置 cookie?
【发布时间】:2018-05-30 17:31:13
【问题描述】:

我很难让 cookie 工作,在服务器端我使用它们通过从 req.cookies 中获取它们来验证用户。

这是我目前在 React Native 中的 Login.js 文件上设置它的方式:

import Cookies from "universal-cookie";

const cookies = new Cookies();
 cookies.set("token", token, {
                expires: 7, // 7 days
                path: "/"
                //,secure: true // If served over HTTPS
   });

当我在此页面上调用 cookies.get("token") 时,这可以正常工作。但是,当我导入、设置 const 并在另一个页面上调用 get 时,令牌不会显示...

另外,当我像这样进行提取时:

fetch("http://192.168.0.115:3000/myTransactions/", {
      credentials: "same-origin",
      method: "POST",
      headers: {
        Accept: "application/json",
        "Content-Type": "application/json"
      }
    })

服务器没有收到任何 cookie。我什至将凭据更改为包含。

我在 Windows 上使用 expo 和我的终端来运行它,而无需使用 android studio 或 xcode。我不确定这是否是一个可能的问题。

任何想法!

谢谢

【问题讨论】:

  • 尝试将文件名Login.js改为Login.jsx
  • 你确定 Universal-cookies 在 React Native 中有效吗?可能期望浏览器实现一个 API 来存储 cookie。
  • 嗯,我不确定,我以前在 Android Native Coding 中使用过 cookie,那么如何使用 React Native 来做同样的事情?
  • 这个链接可能对你有用stackoverflow.com/questions/39826992/…
  • 这个链接可能对你有用stackoverflow.com/questions/39826992/…

标签: javascript reactjs cookies react-native


【解决方案1】:

react-native-keychain 比 cookie 更安全!

第二,你试过AsyncStorage吗?这本质上是内置在“localStorage”中的 React Native。我想这就是你要找的。​​p>

// to set
AsyncStorage.setItem('@app:session', token);

// to get
AsyncStorage.getItem('@app:session').then(token => {
  // use token
});

如果您的设置看起来像这样,您只需将令牌值作为标头发送,您可以以最安全/最方便的任何格式存储此信息。

在本例中,auth 可以是获取的这些选项之一。

localStorage.set('token', 38573875ihdkhai)
createCookie('ppkcookie' 7asdfasdf);

export const userFetchRequest = () => (dispatch, getState) => {
  let {auth} = getState();
  return superagent.get(`${__API_URL__}/user/me`)
    .set('Authorization', `Bearer ${auth}`)
    .then(res => {
      dispatch(userSet(res.body));
      return res;
    });
};

【讨论】:

  • 请看我下面的评论。我再次在网站上使用 cookie,所以我需要让 cookie 工作:/
  • 不明白,这很好,但我在设置标题时遇到了麻烦。关于代码,请查看我在上面调用的 fetch。如何为此在标题中添加“Cookie”?不确定我是否理解您发布的这个新代码?感谢您的帮助!
【解决方案2】:

您可以使用 cookie 或将令牌存储在 localStorage 中以供网络应用使用。

但是对于 React Native 应用来说,使用 AsyncStorage 会是更好的解决方案。

关于异步存储

AsyncStorage 是一个简单的、未加密的、异步的、持久的、 应用程序全局的键值存储系统。应该使用 而不是 LocalStorage。

在 iOS 上,AsyncStorage 由存储小值的本机代码支持 在序列化字典和单独文件中的较大值中。在 Android,AsyncStorage 将根据什么使用 RocksDB 或 SQLite 可用。

另外,AsyncStorage 有非常简单的 API:

const TOKEN = "TOKEN";

// save token
AsyncStorage.setItem(TOKEN, token);

// get token
AsyncStorage.getItem(TOKEN).then(token => {
  // token value could be used
});

如果您担心 AsyncStorage 安全性,您可以通过link 找到更多信息。

【讨论】:

  • 我寻找 cookie 的原因是因为我需要在发出请求时为每个标头传递相同的令牌。此外,由于服务器正在与网站合作,因此它会从网站中查找 cookie,因此我认为我也可以保持相同的调用来检查应用程序......如果我至少可以在标头中从异步发送令牌的任何想法作为饼干。整件事都有问题
  • 是的,如果您发布有关如何设置标题的代码,我可以确定。但是,如果您将其作为不记名身份验证发送,则可以轻松使用任何类型的散列或您选择的特殊关键字。在这种情况下,它将是您使用异步创建的集合
  • 如果您快速概述一下您的架构,可能会更清楚。但我假设当 Web 或移动用户 pinfa 你的后端时,它会在标题中发送一个 cookie(在你的情况下它只是数字或字母的散列?)。无论应用程序如何,您都可以获取该 cookie 的值并将其设置为您选择的任何方法。
  • 当您说您需要 cookie 工作时,您必须了解,cookie 是一种将用户信息本地存储在其机器上以加快页面重新加载速度的方法。它所做的只是存储开发人员放在那里的信息。所以我会问你需要“cookies”来验证用户是否正确?好吧,“cookie”(可能)只是一个散列的数字/字符/或字母字符串。您在 Web 应用程序上使用 cookie 的方式(可能)是存储“cookie”(数字/字母)(来自后端)以用于自动验证未来的请求。我的观点是坚持。
  • 您可以使用本地存储或异步存储完全相同的数字/字母/字符,它只是以不同的形式保存该字符串。
猜你喜欢
  • 2021-07-12
  • 2022-10-14
  • 2022-09-29
  • 1970-01-01
  • 2021-08-20
  • 2019-02-02
  • 1970-01-01
  • 2022-10-15
  • 2022-12-02
相关资源
最近更新 更多