Хранение информации OpenID в базе данных - PullRequest
7 голосов
/ 08 октября 2009

Это вопрос базы данных. У меня уже установлена ​​и работает библиотека openid.

Я хочу использовать OpenID на веб-сайте, над которым я работаю. Существует три типа пользователей.

  1. Именованные учетные записи, использующие электронную почту / пароль для аутентификации
  2. Именованные учетные записи, использующие OpenID для аутентификации
  3. Анонимный аккаунт, использующий OpenID для аутентификации

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

В настоящее время оба набора учетных записей хранятся в одной таблице с использованием следующей схемы. (Да, это рельсовая миграция)

create_table :users do |t|
  t.string :name #unique because it maps to a subdomain
  t.string :openid_url #unique
  t.string :email #unique 
  t.string :password_hash
  t.string :password_salt
  t.boolean :guest #Anonymous user flag

  t.timestamps
end

(openid_url уникален для предотвращения привязки нескольких учетных записей к одному и тому же openid. email уникален, поскольку пользователи входят в систему с помощью электронной почты / пароля)

Я использую эту настройку. У меня возникла проблема с реализацией Google OpenID. Каждый пользователь, использующий Google для OpenID, имеет одинаковый URL: https://www.google.com/accounts/o8/ud.

Как мне поддержать использование Google в качестве поставщика openid, поскольку его URL-адреса не являются уникальными для каждого пользователя? (Пожалуйста, запомните существующие ограничения)

Примечание. Учетные записи Google могут использовать любой действующий адрес электронной почты в Интернете, поэтому я не могу просто сохранить person@google.com в поле openid_url, так как это может быть person@example.com или хуже person@yahoo.com! Yahoo также использует этот метод с одним URL, поэтому я тоже должен их поддерживать.

Ответы [ 2 ]

8 голосов
/ 08 октября 2009

Сохраните значение openid.claimed_id. Это уникально для каждого пользователя. Google OpenIDs действительно уникальны. Все они начинаются с одинакового значения, но имеют уникальные ?id=uniquenesshere строки запросов. Помните, что эти значения следует учитывать с учетом регистра, поэтому сохраняйте регистр и сопоставляйте его с регистром при поиске пользователей.

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

0 голосов
/ 03 ноября 2009

openid_url здесь не нужен. Для обеих учетных записей работает только UserID или имя (уникальное) Вы также можете создать отдельную таблицу с openid и идентификатором пользователя из таблицы UserAccount.

...