Как передать сессионный cookie в Play через Uploadify? - PullRequest
4 голосов
/ 24 января 2012

Я пытаюсь использовать Uploadify , загрузчик файлов Ajax, с Play Framework .

Uploadify использует объект Flash для связи с сервером ... поэтому по умолчанию он не использует файлы cookie для воспроизведения. Я хочу правильно аутентифицировать своего пользователя, поэтому мне нужно загрузить файл для отправки файлов cookie через себя.

Есть ли у кого-нибудь работающий пример того, как они работают вместе или, если это не так, некоторые указатели?

Ответы [ 2 ]

0 голосов
/ 22 марта 2012

Что ж, если вы используете httpOnly конфигурацию ( и вам нужно !), То невозможно передать собственный файл аутентификации Play Play для загрузки.

То, что я сделал, было:

1. Не защищайте контроллер изображений с помощью @With(Secure.class), а вместо этого используйте before method:

@Before(unless = "uploadPost")
public static void before() throws Throwable {
    Secure.checkAccess();
}

2. Передайте два параметра от контроллера, который отображает страницу с плагином загрузки: userId и signatureUserId

String userIdSignature = Crypto.sign(Long.toString(user.id));
render(..., user.id, userIdSignature);

3. Передайте эти два параметра для загрузки и в метод uploadPost

public static void uploadPost(Upload upload, long userId, String userIdSignature) {
    assertEquals(userIdSignature, Crypto.sign(Long.toString(userId)),
        "Failed to authenticate user ID " + userId);

Если по какой-то причине вы не хотите, чтобы клиент знал свой идентификатор пользователя, альтернативой подписи является шифрование идентификатора пользователя.

Обратите внимание, что вы все еще подвержены атакам воспроизведения с использованием этого метода, но я считаю, что это общая проблема с Play (я могу ошибаться по этому поводу). Вы можете добавить срок годности к подписи, чтобы ограничить ущерб.

0 голосов
/ 25 января 2012

uploadify имеет опцию scriptData , которую вы могли бы использовать для отправки вашего подлинностиToken:

#{authenticityToken /}

<script>
var token = $('#input[name=authenticityToken]').val();
$('#file_upload').uploadify({
  'uploader'    : '/uploadify/uploadify.swf',
  'script'      : '/uploadify/uploadify.php',
  'cancelImg'   : '/uploadify/cancel.png',
  'folder'      : '/uploads',
  'scriptData'  : {'authenticyToken': token}
});
</script>
...