如何像使用 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(未经授权)