【发布时间】:2019-12-15 00:18:26
【问题描述】:
我想在 React Native 应用中使用 Apollo 中间件在每次向 GraphQL 发出请求之前实现自动刷新 jwt 令牌。每次用户登录后,他都会获得两个令牌:访问和刷新。访问令牌是在授权标头中使用的 30-60 分钟的简短令牌。刷新令牌是 60 天的长令牌,用于确认刷新令牌 graphql 突变。 我的流程:
- 用户登录并获得 2 个令牌 -> 使用 Appollo setContext 将访问令牌放入授权标头。
- 用户向 GraphQL 发出请求 -> 在客户端检查 accessToken 的 expireTime: -> 如果它没有过期 -> 确认请求 -> 如果它已过期 -> 调用 GraphQL refreshToken 突变 -> 获取新令牌 -> 确认请求。 为了在客户端保留令牌,我使用 KeyChain 存储。你能告诉我我是否也应该使用 Apollo 缓存来保存令牌?我应该为令牌写 Apollo 状态吗?以及如何实施我的流程?
GraphQL 突变
mutation UpdateTokens($refreshToken: String!, $refreshTokenId: String!)
{
updateTokens(refreshToken: $refreshToken, refreshTokenId: $refreshTokenId) {
user {
name
phone
}
accessToken
refreshToken
}
}
App.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
【问题讨论】:
-
您能否提供有关如何在 grapQL - React native 中访问请求标头的输入? stackoverflow.com/questions/64617612/…
-
链接不再有效
标签: node.js react-native jwt graphql apollo-client