Я пытаюсь переварить авторизацию 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? Что я делаю неправильно?