Arg, отвечая на мой предыдущий комментарий выше.
К вашему третьему вопросу "меры ... для предотвращения входа кого-либо в качестве другого пользователя ...", как я понимаю OpenId, вы никогда не принимаете URL-адрес OpenId из ненадежного источника. В реализации на вашем сайте размещается логин провайдера, сайт провайдера связывается с вами напрямую , поэтому вы всегда принимаете URL-адрес OpenId с доверенного сайта.
Другими словами, даже если злонамеренный пользователь собирает OpenIds, такие как Pokemon, у него нет средств для доступа к вашей системе.
На ваш второй вопрос "как мне хранить ..." ваша схема будет работать, хотя выглядит немного расслабленной. Например, используя сопоставление «многие ко многим» [т.е. UserID to OpenID
], вы разрешаете пользователю принадлежать ко многим OpenIds, а один OpenId - ко многим пользователям. Вы хотите первое без второго.
Достаточно простого ограничения внешнего ключа.
UserID Email
------ ---------------
86000 bob@yahoo.com
86001 alice@yahoo.com
UserID Identifier
------ ----------------
86000 https:\\me.yahoo.com\bob#d36bd
86000 https:\\me.yahoo.com\bigbobby#x75af
86001 https:\\me.yahoo.com\alice#c19fd
При условии, что UserID
является внешним ключом для таблицы Users
, и существует ограничение уникального ключа для Identifier
, это, по сути, означает, что User
имеет ноль или множество уникальных Identifier
s. В принципе, я бы, вероятно, также ударил первичный ключ на этой таблице, но это подливка.
Надеюсь, это поможет:)
PS Если у вас есть сомнения по поводу интеграции или использования OpenId, то перейдите к реализации. Определите каждый бит источника в URL-адресе OpenId, а затем спросите себя, возможно ли для злоумышленника получить доступ к этой точке входа. Я надеюсь, что есть только одна такая точка входа, и она недоступна для всех, кроме доверенных поставщиков OpenId.