Перенаправление на страницу после аутентификации через OpenID, Oauth или Facebook Connect - PullRequest
3 голосов
/ 10 февраля 2010

Я разрешаю пользователям входить на мой сайт с помощью OpenID, Twitter OAuth или FBConnect.Если пользователь пытается перейти на страницу, которая требует, чтобы он вошел в систему, после этого пользователь входит в систему, я хочу отправить его НАЗАД на эту страницу.Есть ли простой способ сделать это со всеми из них, или я должен просто написать страницу перенаправления в куки и при успешном входе отправить их на эту страницу?Я использую Django, так что, если есть какие-то полезные советы или рекомендации, касающиеся этого, это было бы здорово.

Спасибо за ввод заранее!

Ответы [ 2 ]

2 голосов
/ 10 февраля 2010

Вы можете пропустить этот параметр (страницу, на которой они находились) как параметр к вашему return_to.Как отмечено в спецификации :

Примечание: URL-адрес return_to МОЖЕТ использоваться в качестве механизма для проверяющей стороны, чтобы присоединить контекст о запросе аутентификации к ответу аутентификации.Этот документ не определяет механизм, с помощью которого RP может гарантировать, что параметры запроса не будут изменены внешними сторонами;такой механизм может быть определен самим RP.

Например:

def sendOpenIDCheck(...):
    # after getting an AuthRequest from Consumer.begin
    return_to = oidutil.appendArgs(return_to,
        {'destination_url': that_place_they_tried_to_go})
    return redirect(auth_request.redirectURL, realm, return_to))


def handleReturnTo(request):
   # after doing Consumer.complete and receiving a SuccessResponse:

   return redirect(request.GET['destination_url'])

Если есть какое-то другое состояние, которое вам нужно отслеживать (например, данные POST), или у вас естьчрезвычайно длинный URL, который вы не можете вписать в качестве параметра запроса, или вам нужно, чтобы пользователь подделал destination_url, вы храните эту информацию на стороне сервера, отправляете ключ в качестве параметра запроса вместо URLи посмотрите его, когда они вернутся.

Не сильно отличается от сохранения его в сеансе, если только у пользователя не было нескольких одновременных вкладок в одном сеансе, которые затем выполняются, а затем наличие в запросе помогает.

1 голос
/ 10 февраля 2010

К сожалению, OAuth и OpenID на самом деле не знают о состояниях вашего приложения (в то время как OAuth WRAP может быть). Таким образом, вы должны принять следующее предположение:

  • Пользователь завершит вход без переключения вкладок / окон или выполнения других запросов на вашем сайте.

Тогда вы можете сделать следующее:

  1. После обнаружения доступа к защищенному сайту сохраните полный запрос в сеансе. Это не будет работать вообще, если это POST-запрос, вы должны подготовиться к этой проблеме (показать им сайт с предупреждением о том, что они должны войти первым).
  2. Сохранить временную метку, когда этот запрос произошел.
  3. В вашем обратном вызове OpenID проверьте, установлены ли переменные сеанса, и перенаправьте пользователя на сохраненный запрос. Проверьте метку времени (не перенаправляйте, если метка времени старше 5 минут или около того). После этого удалите обе переменные из сеанса.

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

...