如何像使用 axios auth 选项一样通过 apollo 客户端传递应用程序凭据

Posted

技术标签:

【中文标题】如何像使用 axios auth 选项一样通过 apollo 客户端传递应用程序凭据【英文标题】:How to pass application credentials through apollo client like we do with axios auth options 【发布时间】:2020-10-02 10:39:59 【问题描述】:

我想知道如何像在 axios 中那样将应用程序凭据(甚至是通过代码的用户凭据)传递给 apollo 客户端。

在 axios 中 -

const data = await axios(
  method: "POST",
  url: `$SOME_URL`,
  auth: 
    username: USER,   //like this//
    password: PASS,
  ,
  data: req.body,
  headers:  Accept: "application/json" ,
);

对于 apollo 客户端,我使用了 apollo-link-http,我的设置如下 -

import fetch from "unfetch";
import  ApolloClient  from "apollo-client";
import  from  from "apollo-link";
import  onError  from "apollo-link-error";
import  createHttpLink  from "apollo-link-http";

const client = new ApolloClient(
  link: from([errorLink, standardVariablesLink, typenameCleanerLink, createHttpLink( uri: "https://graphql-backend/graphql", fetch )]),
  cache,
);

我尝试在 createHttpLink 对象中添加 credentials option 作为 credentials: $USER:$PASS 或作为对象

credentials: 
  user: USER,
  password: PASS

但这没有用。

任何帮助表示赞赏。谢谢!!

【问题讨论】:

@xadm 我已经搜索了一周的文档,但找不到与它相关的任何内容。取而代之的是建议使用 cookie 之类的替代方法,但这不是我可以采取的选择。建议的其他方法,我已经尝试过,但它不像我提到的那样有效。 @xadm 是的,这行得通。谢谢。您可以添加一个答案,以便我可以投票并接受它吗? 【参考方案1】:

问题:

axios 中的 auth 是什么? ...搜索一下:基本身份验证选项! axios 在内部将其转换为标题。

Apollo 客户端不太好......你需要将参数转换为 header 本身并使用这种方式:

 const link = createHttpLink(   
   headers:      
     authorization: "Basic btoa_converted_username_password";   
   , 

【讨论】:

再次感谢。我不知道 axios 把那些 auth 选项变成了普通的授权头。【参考方案2】:

axios 中的auth 选项只是构造Basic Authorization header 的一种简写方式。为了构造要包含在标头中的凭据值,请执行以下操作:

用户名和密码用冒号组合 (aladdin:opensesame)。 生成的字符串采用 base64 编码 (YWxhZGRpbjpvcGVuc2VzYW1l)。

所以你可以这样做:

createHttpLink(
  uri: '...',
  headers: 
    Authorization: `Basic $window.btoa(`$username:$password`)`,
  
)

如果您在 Node.js 中运行此代码,您将使用以下代码而不是 btoa

Buffer.from(`$username:$password`).toString('base64')

另请注意,如果此代码在客户端运行,您可能希望使用 setContext 动态注入标头。

【讨论】:

谢谢,问题解决了。我在客户端使用它,有没有办法使这些结果字符串(base64 编码)不会出现在网络选项卡或其他东西的标题中,因为如果有人从那里拿起它,它可以用来获取凭据。 在开发客户端应用程序时,您不应在代码中嵌入任何凭据,因为您的代码是公开的,任何人都可以阅读它。如果您将基本身份验证用作客户端应用程序的一部分,则用户应以某种方式提供凭据。即便如此,即使通过 HTTPS 完成,using basic auth is generally inadvisable。

以上是关于如何像使用 axios auth 选项一样通过 apollo 客户端传递应用程序凭据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 axios 在 rest-auth 中使用令牌发布? POST http://localhost:8000/rest-auth/password/change/ 401(未经授权)

如何在.onRequest拦截器中使用axios helper setToken

nuxtjs 环境中添加全局axios

如何在 nuxt/axios 中设置 baseUrl?

如何使用授权承载 + 令牌使用 Axios 注销用户

在vue中使用axios的Cors和预检错误