Должен ли сервер oAuth предоставлять тот же доступ к Token одному и тому же запросу клиента?
Я разрабатываю сервер oAuth2, и я наткнулся на этот вопрос.
Предположим, что сценарий, в котором мои токены установлены, истекает в течение одного часа. В этот промежуток времени один клиент проходит через неявное auth пятьдесят раз, используя тот же client_id
и тот же redirect_uri
. В принципе же все.
Должен ли я предоставить ему тот же accessToken
, сгенерированный по первому запросу на последующих, до истечения срока его действия, или я должен выполнить новый accessToken
для каждого запроса?
Преимущества отправки одного и того же токена в том, что я не оставлю устаревшие и неиспользуемые токены клиента на сервере, минимизируя окно для злоумышленника, пытающегося угадать действительный токен.
Я знаю, что я должен оценивать ограничения, и я это делаю, но в случае большой атаки ботнета из тысяч разных машин некоторые ограничения не вступят в силу немедленно.
Однако я не уверен в недостатках этого решения и почему я пришел сюда. Это допустимое решение?
Ответы
Ответ 1
Я бы сказал - нет.
Причины:
- НИКОГДА не следует хранить токены доступа в текстовом виде на стороне сервера авторизации. Ленты доступа - это учетные данные и должны храниться в хэшировании. Солить может быть не нужно, так как они все равно генерируются. См. OAuth RFC point 10.3.
- В зависимости от того, как вы обрабатываете последующие запросы - злоумышленник, который знает, что определенный владелец ресурса использует вашу службу и повторяет запросы для используемого идентификатора клиента. Таким образом, злоумышленник сможет выдавать себя за владельца ресурса. Если вы действительно вернете один и тот же токен, по крайней мере, убедитесь, что вы каждый раз проверяете подлинность владельца ресурса.
- Как насчет параметра "состояние"? Будете ли вы считать запросы "одинаковыми", если параметр состояния отличается? Если нет, то ботнет-атака будет просто использовать другое состояние каждый раз и заставлять вас выдавать новые токены.
В качестве дополнения - в целом защита от атаки ботнета через логику приложения очень сложна. Сервер, подвергая вашу AS интернету, должен позаботиться об этом. На прикладном уровне вы должны позаботиться о том, чтобы он не опускался от атак с малой пропускной способностью.
Ответ 2
Вы можете вернуть тот же access_token
, если он все еще действителен, с этим нет проблем. Единственным недостатком может быть тот факт, что вы используете неявный поток и, таким образом, повторно отправляете токен того же, действительного доступа в фрагменте URL-адреса, который считается менее безопасным, чем использование, например. поток авторизационного кода.
Ответ 3
В качестве правила большого пальца никогда не используйте повторно ключи, это приведет к дополнительной безопасности в проектируемой системе в случае захвата ключа
Ответ 4
Вы можете отправить токен доступа другой по запросу после правильной проверки подлинности, а также отправить токен обновления по токену доступа.
После того, как ваш токен доступа истекает, вы должны сообщить об этом пользователю, и пользователь должен повторно запросить новый токен доступа, предоставляющий одноразовый токен обновления, который ранее предоставлялся им, пропуская необходимость повторной аутентификации, и вы должны предоставить новый токен доступа и обновить токен.
Чтобы противостоять атаке с помощью фальшивого токена обновления, вы должны занести их в черный список вместе с исходящим IP после нескольких предупреждений.
PS: никогда не используйте предсказуемые токены. По крайней мере, чрезвычайно сложно атаковать грубой силой, используя полностью случайные длинные буквенно-цифровые строки. Я бы предложил bin2hex(openssl_random_pseudo_bytes(512))
, если вы используете php.