Как получить токен сеанса при аутентификации в JSON REST API (в R) - PullRequest
6 голосов
/ 09 марта 2020

Я пытаюсь получить доступ к JSON данным (в R ) из REST API.

Для аутентификации мне нужно использовать метод POST в https://dashboard.server.eu/login. Данные, которые необходимо отправить, - это электронная почта и пароль:

library(httr)

login <- list(
  email = "my@email.com",
  password = "mypass"
)

res <- POST("https://dashboard.server.eu/login", body = login, encode = "form", verbose())

При выполнении вышеизложенного я получаю следующий вывод:

-> POST /login HTTP/1.1
-> Host: dashboard.server.eu
-> User-Agent: libcurl/7.59.0 r-curl/3.3 httr/1.4.1
-> Accept-Encoding: gzip, deflate
-> Cookie: session=10kq9qv1udf0107F4C70RY14fsum41sq50
-> Accept: application/json, text/xml, application/xml, */*
-> Content-Type: application/x-www-form-urlencoded
-> Content-Length: 53
-> 
>> email=my%40email.com&password=mypass

<- HTTP/1.1 200 OK
<- access-control-allow-headers: Accept, Authorization, Content-Type, If-None-Match
<- access-control-allow-methods: HEAD, GET, POST, PUT, DELETE
<- cache-control: no-cache
<- content-encoding: gzip
<- content-type: application/json; charset=utf-8
<- date: Mon, 09 Mar 2020 14:58:31 GMT
<- set-cookie: session=10kq9qv1udf0107F4C70RY14fsum41sq50; HttpOnly; SameSite=Strict; Path=/
<- vary: origin,accept-encoding
<- x-microserv: NS4yNi4xODQuMjE3
<- x-poweredby: Poetry
<- Content-Length: 2346
<- Connection: keep-alive

В do c сайта сказано, что в случае успеха возвращается JSON res и содержит строковый токен в res.data._id.

enter image description here

Я не найти его ... даже просматривая каждый список (и подсписки) res.

Как мне найти токен?

После do c и например, в AngularJS, я тогда должен сделать:

// Create JSON Object with your token
let authorizeObject = {
    'Authorization': 'Session ' + token,
    'content-type': 'application/json;charset=UTF-8',
    'accept': 'application/json,text/plain',
};

// Create header from the previous JSON Object
let header = {'headers':authorizeObject};

// Use the header in your http request...
$http.get('https://dashboard.server.eu/', header)

Любой намек на то, чтобы этот сон стал реальностью?

ОБНОВЛЕНИЕ - С помощью cURL я могу проверить, есть ли возвращаемая _id ключ / значение…

С помощью команды:

curl -k -X POST "https://dashboard.server.eu/login" \
             -d '{ "email" : "my@email.com", "password" : "mypass" }' \
             -H "Content-Type: application/json"

Я получаю вывод:

{
  "_id": "697v2on4ll0107F4C70RYhosfgtmhfug",
  "isAuthenticated": true,
  "user": {
    "_id": "5dd57868d83cfc000ebbb273",
    "firstName": "me",
    "lastName": "Me",
...

Итак, токен сеанса действительно где-то ...

Помогает ли это мне помочь?

1 Ответ

6 голосов
/ 12 марта 2020

Глядя на изображение res в вашем вопросе, сообщение там там, под content - просто содержимое хранится как вектор необработанных байтов, вот почему вы не сделали не распознает это как json.

Поскольку http может отправлять файлы любого типа, содержимое объекта ответа httr хранится в необработанном формате, а не в символьной строке по разным причинам - возможно, наиболее важно, потому что многие двоичные файлы будут содержать 0x00 байт, что недопустимо в символьной строке в R.

В вашем случае мы можем не только сказать, что res$content - это текст, но и что это ваш " отсутствует "json. Первые шесть байтов res$content показаны на вашем изображении и равны 7b, 22, 5f, 69, 64, 22. Мы можем преобразовать их в символьную строку в R, выполнив:

rawToChar(as.raw(c(0x7b, 0x22, 0x5f, 0x69, 0x64, 0x22)))
[1] "{\"_id\""

Это соответствует первым шести символам вашей ожидаемой json строки.

Поэтому, если вы сделаете:

httr::content(res, "text")

или

rawToChar(res$content)

Вы получите json в виде строки символов.

...