Можно ли помочь мне понять это? “Общие Ошибки REST: Сессии не важны”

Чтобы получить из файла json информацию, которую вы хотите сохранить (два списка), вы можете просто импортировать json, загрузить файл и запросить его как словарь.

Представьте, что у вас есть такой json:

{
    "users": ["Bacon", "Eggs", "Toast"],
    "passwords": ["Please don't do it this way though!", "runny", "buttered"]
}

Можно просто:

import json

path_to_json = "./stackoverflowexample.json"

with open(path_to_json, "r") as handler:
    info = json.load(handler)

users = info["users"]
passwords = info["passwords"]

print("User 0 '{}', has password '{}'".format(users[0], passwords[0]))

Это очень небезопасный метод хранения паролей, он очень неэффективен, и вы ' Скорее всего, в какой-то момент возникнут проблемы с согласованностью.

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

Пример:

import sqlite3
import hashlib
import uuid

user_table_definition = """
CREATE TABLE users (
    username TEXT,
    salt TEXT,
    hpassword TEXT
)"""
add_user_sql = "INSERT INTO users VALUES ('{}','{}','{}')"

connection = sqlite3.connect("./stackoverflowdb.db")
cursor = connection.cursor()

cursor.execute(user_table_definition)


# Add incoming user
username = "Bacon"
password = "This is a little better, but this is just an outline..."

salt = uuid.uuid4().hex
hashedpassword = hashlib.sha512((salt + password).encode("UTF-8")).hexdigest()

cursor.execute(add_user_sql.format(username, salt, hashedpassword))

# Check incoming user

username = "Bacon"
password = "This is a little better, but this is just an outline..."

row = cursor.execute("SELECT salt, hpassword FROM users WHERE username = '{}'".format(username)).fetchone()

salt, hpassword = row  # Unpacking the row information - btw this would fail if the username didn't exist

hashedIncomingPwd = hashlib.sha512((salt + password).encode("UTF-8")).hexdigest()

if hashedIncomingPwd == hpassword:
    print("Winner winner chicken dinner we have a live one!")
else:
    print("No access for you")

Это только показывает вам строки, которые составляют ядро ​​того, что вы хотите, вы должны переместить некоторые из этих строк в функции, вы не можете вызвать этот код дважды, потому что Стол уже должен быть создан и другие вопросы. Во-первых, вам не нужно использовать sqlite!

SQL - очень полезная вещь для изучения, и, учитывая, что ваш вопрос выглядит как хобби, я бы посоветовал разобраться с этим. Желаем удачи.

159
задан Brad Mace 5 July 2011 в 22:28
поделиться

5 ответов

Чтобы быть УСПОКОИТЕЛЬНЫМ, каждый Запрос HTTP должен содержать достаточно информации отдельно, чтобы ее получатель обработал его, чтобы быть в полной гармонии с природой не сохраняющей состояние HTTP.

Хорошо, я добираюсь, та Аутентификация HTTP сделана автоматически на каждом сообщении - но как?

Да, имя пользователя и пароль отправляется с каждым запросом. Общепринятые методики, чтобы сделать так основная аутентификация доступа и аутентификация доступа обзора . И да, соглядатай может получить учетные данные пользователя. Можно было бы таким образом зашифровать все отправленные данные и полученное использование Безопасность транспортного уровня (TLS) .

это было бы плохо, чтобы иметь сервис REST, скажем, / сессия, которая принимает ПОЛУЧИТЬ запрос, куда Вы передали бы в имени пользователя/пароле как часть запроса и возвратили бы маркер сессии, если бы аутентификация была успешна, который мог бы быть затем передан наряду с последующими запросами? Это имеет смысл с точки зрения REST, или это упускает суть?

Это не было бы УСПОКОИТЕЛЬНО , так как это несет состояние, но это однако довольно распространено, так как это - удобство для пользователей; пользователь не должен входить в систему каждый раз.

то, Что Вы описываете в "маркере сессии", обычно упоминается как cookie входа в систему. Например, при попытке войти в свою учетную запись Yahoo! существует флажок, который говорит, "сохраняют меня, вошел в систему в течение 2 недель". Это по существу говорит (в Ваших словах), "поддерживают мой маркер сессии в течение 2 недель, если я вхожу в систему успешно". Веб-браузеры отправят такие cookie входа в систему (и возможно другие) с каждым Запросом HTTP, который Вы просите, чтобы это сделало для Вас.

79
ответ дан z8000 23 November 2019 в 21:37
поделиться

Сервису REST весьма свойственно потребовать аутентификации для каждого Запроса HTTP. Например, Amazon S3 требует, чтобы каждый запрос имел подпись, которая получена на основании удостоверений пользователя, точный запрос для выполнения, и текущее время. Эту подпись легко вычислить на стороне клиента, может быть быстро проверена сервером и имеет ограниченное применение для взломщика, который прерывает его (так как это основано на текущем времени).

33
ответ дан Greg Hewgill 23 November 2019 в 21:37
поделиться

Хорошо, я добираюсь, та Аутентификация HTTP сделана автоматически на каждом сообщении - но как?

"Авторизация": HTTP-заголовок отправляет клиентом. Или основной (простой текст) или обзор.

это было бы плохо, чтобы иметь сервис REST, скажем, / сессия, которая принимает ПОЛУЧИТЬ запрос, куда Вы передали бы в имени пользователя/пароле как часть запроса и возвратили бы маркер сессии, если бы аутентификация была успешна, который мог бы быть затем передан наряду с последующими запросами? Это имеет смысл с точки зрения REST, или это упускает суть?

вся эта мысль о сессии состоит в том, чтобы сделать с сохранением информации приложения с помощью протокола без сохранения информации о состоянии (HTTP) и немой клиент (веб-браузер) путем поддержания состояния на стороне сервера. Одно из остальных, которые принципы "Каждый ресурс, является исключительно адресуемым использованием универсального синтаксиса для использования в ссылках гиперсреды" . Переменные сеанса - что-то, к чему нельзя получить доступ через URI. ДЕЙСТВИТЕЛЬНО УСПОКОИТЕЛЬНОЕ приложение поддержало бы состояние на стороне клиента, отправив все необходимые переменные HTTP, предпочтительно в URI.

Пример: поиск с разбиением на страницы. У Вас был бы URL в форме

http://server/search/urlencoded-search-terms/page_num

, Это, имеет много общего с bookmarkable URL

5
ответ дан vartec 23 November 2019 в 21:37
поделиться

Я думаю, что Ваше предложение в порядке, если Вы хотите управлять клиентским временем жизни сессии. Я думаю, что Архитектура RESTful поощряет Вас разрабатывать приложения не сохраняющие состояние. Как @2pence записал "каждый Запрос HTTP, должен содержать достаточно информации отдельно, чтобы ее получатель обработал его, чтобы быть в полной гармонии с природой не сохраняющей состояние HTTP" .

Однако не всегда, который имеет место, иногда приложение должно сказать, когда клиент входит в систему или выходит из системы и поддержать ресурсы, такие как блокировки или лицензии на основе этой информации. Посмотрите, что мой продолжать вопрос для примера такого случая.

3
ответ дан Community 23 November 2019 в 21:37
поделиться

Нет, это не упущение. Google's ClientLogin работает точно так же, за тем примечательным исключением, что клиенту дается указание перейти к "/session", используя ответ HTTP 401. Но это не создает сессию, а только создает способ для клиентов (временно) аутентифицировать себя, не передавая учетные данные в открытом виде, и для сервера, который может контролировать действительность этих временных учетных данных по своему усмотрению.

8
ответ дан 23 November 2019 в 21:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: