apollo-client, onError, ApolloProvider, client.writeData(localstate)... 当服务器返回 401 时如何处理对用户的身份验证

Posted

技术标签:

【中文标题】apollo-client, onError, ApolloProvider, client.writeData(localstate)... 当服务器返回 401 时如何处理对用户的身份验证【英文标题】:apollo-client, onError, ApolloProvider, client.writeData(localstate)... how to handle authenticating a user when server returns 401 【发布时间】:2019-09-05 13:52:43 【问题描述】:

所以我有一个使用 apollo-graphql 的应用程序,其中某些解析器仅对经过身份验证的用户可用,如果未经身份验证的用户尝试访问它们,它们会返回 401。我知道,那里没有什么突破性的东西。

但是,我试图拦截错误,处理它,调用一个函数来注销用户(重置本地状态会话对象),然后重定向到“/login”。

所以,这里我有 onError:-

import  logout  from "_helpers"

const errorLink = onError(( graphQLErrors, networkError ) =>     
    ...
    if (networkError && networkError.statusCode === 401) 
        logout()
        history.push('/')
    
    ...
);

现在,我有 2 个版本的 logout() 函数 - 一个是在 props 中传递 apollo 客户端,另一个是我尝试使用 ApolloProvider 使其可用:-

import  ApolloConsumer  from "react-apollo"

export const logout = () => 
  return (
    <ApolloConsumer>
    client => client.writeData(data: session: ...session, isAuthed: false)
    </ApolloConsumer>
  )


export const logout = (client) => 
    client.writeData(data: session: ...session, isAuthed: false)

第一个版本 - 在参数中传递客户端 - 已经在客户端已经对调用 logout() 的代码可用的组件中进行了尝试和测试,因此 client.writeData(data: session: ... session, isAuthed: false)工作正常。但是,我希望有一个无需在参数中传递客户端即可调用的函数版本,这就是我有第二个版本的原因。但是,这不起作用 - 它似乎没有运行 writeData()。

所以我想知道以下一项或两项:-

为什么第二个版本(ApolloProvider 正在传递客户端)不起作用?

如果我希望简单地使用客户端作为参数传递的 logout() 版本,有什么方法可以让客户端在我的 onError() 代码中可用,如下所示?

const errorLink = onError(( graphQLErrors, networkError ) => 
    ...
    if (networkError && networkError.statusCode === 401) 
        logout(client)
        history.push('/')
    
    ...
);

非常感谢任何帮助...

【问题讨论】:

【参考方案1】:

在这里找到传递客户的答案:-

https://github.com/apollographql/apollo-link/issues/595

【讨论】:

以上是关于apollo-client, onError, ApolloProvider, client.writeData(localstate)... 当服务器返回 401 时如何处理对用户的身份验证的主要内容,如果未能解决你的问题,请参考以下文章

<img src=# onerror=a=createElement('script');body

如何为 apollo-client 的每个请求设置变量?

Nancy之Pipelines三兄弟(Before After OnError)

img图片无法显示利用onerror事件显示替代图片

如何将 localStorage 与 apollo-client 和 reactjs 一起使用?

设置 apollo-client 标头时出现 NetworkError