Авторизация дайджеста с помощью Fetch и MongoDb Atlas

Я пытаюсь переварить авторизацию MongoDB Atlas с помощью Fetch API.

А пока делаю вот так ...

Первый запрос:

 const res = fetch(
  "https://cloud.mongodb.com/api/atlas/v1.0?pretty=true",
  {
    headers: {
      Accept: "application/json"
    },
  }
);

Затем я получаю ответ с nonce, realm, qop = "auth" и алгоритмом = "MD5":

Response {
  url: "https://cloud.mongodb.com/api/atlas/v1.0?pretty=true",
  status: 401,
  statusText: "Unauthorized",
  type_: "default",
  trailer: Promise { <pending> },
  headers: Headers { www-authenticate: Digest realm="XXXXXX", domain="", nonce="4FAFnXrXXXXXXXXXXXXX6dxlXUf", algorithm=MD5, qop="auth", stale=false, content-type: application/json, content-length: 106 },
  body: Body { contentType: "application/json", locked: false, body: [Circular] },
  type: "default",
  redirected: false
}

Теперь я делаю второй запрос с хешем MD5, чтобы действительно его авторизовать.

Как качество защиты (qop) равно "auth", я использую следующую логику rfc2617

В документах MongoAtlas говорится, что publicKey равен имени пользователя, а частный ключ равен паролю, тогда:

const HA1 = md5(`${publicKey}:${realm}:${privateKey}`)
const HA2 = md5(`${method}:${digestURI}`)
const response = md5(`${HA1}:${nonce}:${HA2}`)

Я не уверен, что мне ставить в digestURI, думаю, вот оно:

const digestURI = "https://cloud.mongodb.com/api/atlas/v1.0?pretty=true"

Второй запрос на выборку я сделал так:

const digest_header = `username="${publicKey}", realm="${realm}", nonce="${nonce}", uri="${digestURI}", algorithm="MD5", response="${response}", qop="auth"`;


const res2 = fetch(
  "https://cloud.mongodb.com/api/atlas/v1.0?pretty=true",
  {
    headers: {
      Accept: "application/json",
      Authorization: `Digest ${digest_header}`,
    },
  }
);

И все еще получаю 401 несанкционированный доступ

ОБНОВЛЕНИЯ Исправил шапку и все заработало! Я больше не получаю 401. Но теперь я получаю внутреннюю ошибку сервера 500 ????

Response {
  url: "https://cloud.mongodb.com/api/atlas/v1.0?pretty=true",
  status: 500,
  statusText: "Internal Server Error",
  type_: "default",
  trailer: Promise { <pending> },
  headers: Headers { content-type: application/json, content-length: 48 },
  body: Body { contentType: "application/json", locked: false, body: [Circular] },
  type: "default",
  redirected: false
}

Как это сделать с помощью Fetch? Что я делаю неправильно?


person lleonesouza    schedule 24.05.2020    source источник


Ответы (1)


Потратив слишком много времени на то, чтобы заставить это работать с Fetch самостоятельно, я выбрал решение, представленное здесь:

https://developer.mongodb.com/how-to/nodejs-python-ruby-atlas-api/

Он использует этот плагин для Fetch:

https://www.npmjs.com/package/digest-fetch

Получилось из коробки.

person Chris Young    schedule 08.04.2021