Лучший способ установить cookie в php, который может быть аутентифицирован в R?

#php #r #security #cookies #shiny

#php #r #Безопасность #файлы cookie #блестящий

Вопрос:

Это широкий вопрос, и я провел массу исследований по этому вопросу за последние несколько недель. Однако я не нашел хорошего безопасного решения для этого. Я работаю над сайтом, который использует WordPress / PHP, но имеет приложение R Shiny, которое используется в том же домене. Это сайт членства, и приложение R Shiny должно иметь возможность определять, должен ли пользователь, вошедший в систему (через WordPress), иметь доступ к приложению. Я предполагаю, что это обычная задача для других языков, но R Shiny довольно ограничен с точки зрения его возможностей веб-разработки. Единственный способ, который я действительно нашел, чтобы определить, следует ли предоставлять доступ, — это файлы cookie. Однако было сложно найти подход к шифрованию или типу безопасности, который будет работать как между PHP, так и R.

Моя текущая мысль заключается в том, что когда setcookie функция запускается при входе в систему / инициализации, на сервер может быть передан отдельный ключ, который затем будет загружен и аутентифицирован в приложении R Shiny (на стороне сервера) в дополнение к проверке соответствующего файла cookie. Однако у меня гораздо больше опыта работы с R, чем с PHP, поэтому я не уверен, сработает ли это (тем более, что этот «ключ» нужно будет удалить при выходе из системы). Кто-нибудь знает, есть ли рекомендуемый или «лучший» способ аутентификации такого доступа между двумя языками / программами? В частности, ограниченные возможности re: R. Или, может быть, есть ресурсы, которые я могу исследовать? Я уже потратил много времени на работу с libsodium и openssl, которые оба имеют (ограниченные) функции в R, но не повезло с таким подходом к аутентификации сервера.

Любая помощь или идеи будут высоко оценены! Спасибо

Ответ №1:

Со стороны сервера вы можете получить доступ к session$request объекту.

Этот объект будет содержать полный http-запрос, включая заголовки (примечание: поскольку он задается с помощью HTTP GET-запроса, вы можете использовать httpOnly ).

Там много всего:

 names(session$request)
 [1] "SERVER_NAME"                   "SERVER_PORT"                   "rook.url_scheme"               "REQUEST_METHOD"                "rook.version"                 
 [6] "rook.errors"                   "HTTP_SEC_WEBSOCKET_EXTENSIONS" "HTTP_USER_AGENT"               "HTTP_SEC_WEBSOCKET_VERSION"    "HTTP_CONNECTION"              
[11] "SCRIPT_NAME"                   "HTTP_ORIGIN"                   "HTTP_ACCEPT_LANGUAGE"          "rook.input"                    "REMOTE_PORT"                  
[16] "HTTP_COOKIE"                   "HTTP_ACCEPT_ENCODING"          "HTTP_SEC_WEBSOCKET_KEY"        "HTTP_UPGRADE"                  "httpuv.version"               
[21] "HTTP_HOST"                     "HEADERS"                       "PATH_INFO"                     "QUERY_STRING"                  "REMOTE_ADDR"                  
[26] "HTTP_CACHE_CONTROL"            "HTTP_PRAGMA"   
 

Что вас интересует, так это

 > session$request$HTTP_COOKIE
[1] "plop=this"
 

На случай, если вам это нужно, я написал небольшую функцию для анализа строк cookie здесь.

Итак, идея заключалась бы в том, чтобы перенаправить с помощью PHP волю Set-cookie в заголовке, затем внутри {shiny} сеанса проанализировать строку cookie, а затем проверить, что этот cookie действителен.

Если вы используете JWT, вы можете взглянуть на https://cran.r-project.org/web/packages/jose/vignettes/jwt.html

Ps: До сих пор я делал это с помощью NodeJS, поэтому я не совсем уверен, как это работает с PHP.

Комментарии:

1. Спасибо за ответ. Я рассмотрю это позже сегодня вечером. Я немного прочитал о сеансах за последние несколько недель. Итак, в этом случае пользователю придется входить в систему каждый раз, когда он посещает сайт, чтобы информация сохранялась и идентифицировалась для целей доступа? Насколько я понимаю, информация о сеансе очищается при закрытии сеанса. Это правильно?

2. session Объект является новым каждый раз, когда вы подключаетесь к блестящему приложению. Но это верно для любого другого разработчика приложений: всякий раз, когда вы подключаетесь, например, к приложению NodeJS, поскольку связь не имеет состояния, у вас нет идентификатора сеанса со стороны сервера. Вот почему вам нужна форма cookie: cookie хранится в браузере, поэтому сеанс R не имеет к нему никакого отношения, но может использовать его для повторной идентификации пользователя, если это необходимо.

3. В этом случае я в основном пытаюсь гарантировать, что 1.) кто-то не мог просто создать или скопировать существующий cookie, чтобы обойти ограничения доступа, и 2.) им не нужно входить в систему каждый раз, когда они посещают сайт. Может быть, я думаю об этом неправильно, но будет ли этот сеансовый подход достичь этого?