首页 > 解决方案 > 在 Vuejs 中使用带有 Axios 的 HTTP 基本身份验证时出现 401 错误

问题描述

我正在开发一个 Vuejs 应用程序,该应用程序从 Apache Solr 索引获取数据,并且我的应用程序使用Axios与索引一起工作以建立连接。但是,添加了 HTTP 基本身份验证,我无法使身份验证正常工作。标Access-Control-Allow-Origin头是在服务器上设置的(它在将身份验证添加到索引之前工作),所以这不是问题。我正在尝试像这样使用auth配置对象中的对象axios.get()

const params = new URLSearchParams()
params.append('fl', 'label,bundle,entity_id,ss_language,url,is_product_slideshow')
  if (this.nodeType) {
    params.append('fq', 'bundle:' + this.nodeType)
  } else {
    params.append('fq', 'bundle:' + '(article OR document OR video OR product_display)')
  }
  params.append('fq', 'ss_language:' + this.language)
  params.append('fq', 'bs_status:' + 1)
  params.append('fq', '-is_field_restricted_to_internal_use:1')
  params.append('fq', '-is_field_restricted_to_author_of_as:1')
  params.append('fq', '-is_field_pp_confidential:1')
  params.append('fq', '-is_field_pp_do_not_show_item_on_t:1')
  params.append('q', qs)
  params.append('sort', 'is_sort asc')
  params.append('wt', 'json')
  params.append('rows', 10)
  params.append('start', queryStartRows)
  axios.get('https://my-solr-url.com/solr/my-solr-index/select', {
    params: params,
    withCredentials: true,
    auth: {
      username: 'myusername',
      password: 'mypassword'
    }
  })
  .then(response => {
    this.results = response.data.response.docs
    var numFound = this.numFound = response.data.response.numFound
    // Calculate last page.
    var numFoundRounded = Math.floor(numFound / 10) * 10
    var numPages = numFoundRounded / 10
    this.lastPage = numPages
  })

我可以从邮递员那里得到正常运行的查询,所以我知道我有正确的凭据。

从我从文档和其他示例中可以看出,我做得对,但我仍然收到 401 错误。

我还使用 Drupal 站点中的这个索引,在那里,用户 ID 和密码作为 URL 的一部分传递:

https://myusername:mypassword@my-solr-url.com/solr/my-solr-index/select?...

但这种方法在这里也行不通。我需要做些什么不同的事情才能使身份验证正常工作?

标签: javascripthttpauthenticationaxiosbasic-authentication

解决方案


我遇到了与您使用 ExpressJS 应用程序描述的相同的问题;Axiosauth: {username: 'user', password: 'pass'}在浏览器中被 Axios 客户端的 401 拒绝,但来自 Postman 的 200 OK。你提到你正在设置Access-Control-Allow-Origin,我能够通过确保中间件在CORS中间件​​之前执行来解决这个问题auth。我注意到我的 Axios 客户端在导致浏览器基于 CORS 策略阻塞的 OPTIONS请求之前发送了一个 HTTP 请求。GET

对于那些想知道如何根据@Inus 的建议手动计算 base64 编码字符串的人,btoa()可以使用 JS 方法,但是在浏览器中这仍然给了我一个 401(如预期的那样),因为这相当于 Axios 在使用时计算的授权标头财产auth


推荐阅读