在Vuejs中将HTTP基本身份验证与Axios一起使用时出现401错误

时间:2018-06-22 23:40:57

标签: javascript http authentication axios basic-authentication

我正在开发一个Vuejs应用程序,该应用程序从Apache Solr索引获取其数据,并且我的应用程序使用Axios与该索引进行连接。但是,已添加HTTP基本身份验证,并且我无法使身份验证工作。 Access-Control-Allow-Origin头是在服务器上设置的(它在将auth添加到索引之前就起作用了),所以这不是问题。我正在尝试像这样在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
  })

我可以从Postman处正常运行查询,因此我知道我具有正确的凭据。

根据我在文档和其他示例中看到的信息,我做对了,但是仍然出现401错误。

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

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

,但是这种方法在这里也不起作用。要使身份验证正常工作,我需要做些什么?

2 个答案:

答案 0 :(得分:1)

尝试以下代码:

axios({
    method: 'get',
    url: 'https://my-solr-url.com/solr/my-solr-index/select',
    params: params,
    withCredentials: true,
    headers:{Authorization:'Basic '+BASE64ENCODED(USERNAME+':'+PASSWORD)}
})

您必须提供base64编码的用户名+':'+密码进行授权并尝试。

答案 1 :(得分:0)

我遇到了与ExpressJS应用描述的问题相同的问题;在浏览器中,带有auth: {username: 'user', password: 'pass'}的Axios被401从Axios客户端拒绝,但是来自邮递员的200 OK。您提到要设置Access-Control-Allow-Origin,通过确保在CORS中间件之前执行auth中间件,我能够解决此问题。我注意到我的Axios客户端在OPTIONS请求之前发送了HTTP GET请求,该请求导致浏览器根据CORS策略进行阻止。

对于那些想知道如何根据@Inus的建议手动计算base64编码的字符串的人,可以使用btoa() JS方法,但是在浏览器中,它仍然给我401(按预期方式),因为这等效使用auth属性时,将其添加到Axios的计算出的Authorization标头中。