oauth2.0 使用Expo AuthSession处理访问和刷新令牌的正确方法是什么?

liwlm1x9  于 2022-11-21  发布在  其他
关注(0)|答案(1)|浏览(185)

我 有 这样 的 话 :

export const Step1 = () => {
  const [instanceUrl, setInstanceUrl] = useState('')
  const [request, response, promptAsync] = AuthSession.useAuthRequest(
    {
      clientId: '...',
      clientSecret: '...',
      redirectUri: 'exp://localhost:19000',
      scopes: ['read', 'write', 'follow'],
    },
    discovery
  );

  const handleLoginPress = () => {
    promptAsync()
  }

  useEffect(() => {
    const fetchAccessToken = async () => {
      const tokenResult = await AuthSession.exchangeCodeAsync({
        clientId: '...',
        clientSecret: '...',
        code: response.params.code,
        redirectUri: 'exp://localhost:19000',

      }, discovery)

      console.log({ tokenResult })
    }
    if (response.type === 'success') {
      fetchAccessToken()
    }
    console.log({ response })
  }, [response])

  return <><Dialog.Title title="Welcome" />
    <Text>Dialog body text. Add relevant information here.</Text>
    <Input placeholder="Community URL" onChangeText={(v) => setInstanceUrl(v)} />
    <Button color='secondary' disabled={!request} onPress={handleLoginPress}>Login</Button></>
}

中 的 每 一 个
所以 我 可以 得到 令牌 的 结果 , 并 将 其 存储 在 AsyncStorage 中 。 但是 当 它 过期 时 , 我 如何 处理 它 ? 获得 refreshToken 的 正确 方法 是 什么 ? 它 将 存储 在 我 的 代码 库 中 的 什么 位置 ?

3phpmpom

3phpmpom1#

我将试着一个一个地回答这些问题。
获取刷新令牌的正确方法是什么
如果您查看exchangeCodeAsync的结果,您会发现结果实际上是TokenResponse,它为config提供了包括accessTokenrefreshToken在内的所有元数据。
但是到期了怎么处理呢?
这很简单-你只需刷新它,你可以基于配置中的相同 meta信息,或者利用TokenResponse函数,如isTokenFreshrefreshAsync。你也可以提前刷新一些规则。
在我的代码库里会被放在哪里呢
取决于您的需求,以及此令牌的用途。如果您将其用于API访问,则您的网络堆栈可能是刷新它的最佳位置。例如,如果您正在使用Apollo Client,则可以创建a link,以便在收到401响应时进行刷新。此外,如果您预计令牌会经常过期,则可以选择在应用程序启动或应用程序前台事件时刷新它,甚至在点击401之前。
因此,我可以获得令牌结果,并将其存储在AsyncStorage中。
AsyncStorage被定义为一个选项,此外,您可以考虑将SecureStoreexpo provides之类东西作为存储更敏感信息的选项。

相关问题