当前位置: 首页 > 知识库问答 >
问题:

如何使用Apollo和React Native实现每个图形请求之前的自动jwt令牌刷新?

公孙志尚
2023-03-14

我想在React原生应用程序中使用Apollo中间件在每次请求GraphQL之前实现自动刷新jwt令牌。每次用户登录后,他都会得到两个令牌:访问和刷新。访问令牌是在授权头中使用的30-60分钟的短令牌。而刷新标记是60天的长标记,用于确认刷新标记graphql突变。我的流程:

  1. 用户登录并获得2个令牌-

GraphQL突变

mutation UpdateTokens($refreshToken: String!, $refreshTokenId: String!) 
 {
    updateTokens(refreshToken: $refreshToken, refreshTokenId: $refreshTokenId) {
      user {
        name
        phone
      }
      accessToken
      refreshToken
    }
  }

应用程序。js

import React from 'react'
import { ApolloClient } from 'apollo-client'
import { ApolloLink } from 'apollo-link'
import { ApolloProvider } from 'react-apollo'
import { ApolloProvider as ApolloHooksProvider } from 'react-apollo-hooks'
import { createHttpLink } from 'apollo-link-http'
import { InMemoryCache } from 'apollo-cache-inmemory'
import { setContext } from 'apollo-link-context'
import * as Keychain from 'react-native-keychain'
import AppNavigator from './AppNavigator'

const httpLink = createHttpLink({
  uri: 'http://localhost:4000'
})

const cache = new InMemoryCache()

const authLink = setContext(async (req, { headers, ...context }) => {
  const tokens = await Keychain.getGenericPassword()
  const accessToken = tokens.username
  return {
    headers: {
      ...headers,
      authorization: accessToken ? `Bearer ${accessToken}` : ''
    },
    ...context
  }
})

const client = new ApolloClient({
  link: ApolloLink.from([authLink, httpLink]),
  cache,
  connectToDevTools: true
})

const App = () => {
  return (
    <ApolloProvider client={client}>
      <ApolloHooksProvider client={client}>
        <AppNavigator />
      </ApolloHooksProvider>
    </ApolloProvider>
  )
}

export default App

共有1个答案

赫连正初
2023-03-14

我真的认为你走在正确的道路上——当我读到你需要的功能时,我想到了阿波罗-链接-上下文,很高兴看到你正在采取这种方法。我们最近不得不在一个反应本机应用程序中实现类似的功能,这需要附加带有身份验证相关数据的自定义标题。为了检索这些数据,我们需要发出异步请求,尽管我们的请求是通过网络发送给第三方服务的。我们像你一样在客户端的setContext中完成了这一切。这很有效。

我认为你不需要担心用你的代币更新你的阿波罗缓存,不管是手动还是其他方式,至少有几个原因。首先,考虑到存储内容的准敏感性质,最好的做法是采用更安全的存储解决方案,在本例中,它很可能是钥匙链。此外,为应用程序中的标记提供一个真实来源可以保持干净。

假设您不想将这些数据写入缓存,我会再次检查Apollo客户端是否自动这样做。例如,如果您之前出于某种原因查询了您的令牌数据,Apollo可能会在收到有效负载后自动更新您的缓存。只是需要注意的事情。

 类似资料:
  • 我正在创建REST API(Symfony 4,FOS REST捆绑包),为了测试,我正在使用Postman应用程序。问题是,在登录请求时,我获得了JWT令牌,之后,在每个其他请求中,我都必须将其作为授权标头的一部分作为承载令牌传递回去。由于每次登录时该令牌都会发生变化,因此每次登录后(当令牌过期时),我都必须手动复制/粘贴令牌值。 这能以某种方式避免并自动完成吗?

  • 问题内容: 我们的React Native Redux应用程序使用JWT令牌进行身份验证。有许多操作需要此类令牌,​​并且例如在应用加载时会同时分派许多令牌。 例如 双方并要求JWT。我们将令牌保存在和中。我的问题是如何处理令牌到期。 最初,我将使用中间件来处理令牌到期 } 我遇到的问题是,对于令牌和操作,都会刷新令牌,因为在分发令牌和令牌时,令牌将过期。理想情况下,我想“暂停”需要身份验证的操作

  • 我遇到的问题是,和操作都将刷新令牌,因为在分派时,令牌将过期。理想情况下,我希望“暂停”需要身份验证的操作,直到令牌刷新。有没有一种方法可以用中间件做到这一点?

  • 我使用jwt为用户在我的应用程序上执行操作提供授权。它工作得很好,因为我不必访问数据库来查看用户是否有效。我在jwt中遇到的问题是,当令牌过期时,用户必须再次登录。在网上阅读我一直在阅读刷新令牌可以用来解决这个问题,但没有白痴证明解释它如何工作。它们是如何工作的?需要数据库访问吗?

  • 我正在构建一个使用JWT进行身份验证的应用程序。我开始做一些研究,但对于诸如刷新令牌和令牌存储之类的主题缺乏共识,我感到惊讶。 据我所知,JWT和OAuth是两个不同的协议,它们遵循不同的规范。 但我的问题是,对于一个没有通过第三方资源服务器如Google、Facebook等认证的应用程序,有一个刷新令牌真的有用吗?为什么不让JWT令牌像刷新令牌一样持续时间长。 另一方面,我可以看到,如本文所述,

  • 这是我的身份验证流程: 用户登录后收到两个令牌(具有过期时间的访问令牌和没有过期时间的刷新令牌) 对于每个用户,刷新令牌存储在数据库中名为refreshTokens的json列中(这是一个数组) 在客户端,访问令牌和刷新令牌都存储在本地存储器上 当需要验证用户时,如果访问令牌过期,将使用刷新令牌创建一个新的访问令牌,并将其发送回用户并保持用户登录 当用户注销时,数据库中存储的刷新令牌(在refre