Рекомендуемая структура базы данных для провайдера OAuth
Я реализую OAuth-провайдер, используя библиотеку DevDefined.
Интересно, существует ли какая-либо рекомендуемая структура базы данных для хранения данных о потребителях и токенах на стороне сервера.
Любые советы по этому вопросу будут оценены.
Ответы
Ответ 1
Примечание. Ответ ниже применим в основном к OAuth 1.0
Я ничего не знаю о библиотеке DevDefined. Но вот нетехническое описание дизайна базы данных, в котором я работал в своем последнем проекте, используя базу данных SQL.
Он должен охватывать все необходимое, чтобы следовать базовой спецификации. Я пытался довести его до абсолютного минимума.
RequestTokens
- (я использую MD5 здесь, первичный ключ)
- consumerKey (уникальный идентификатор для потребителя)
- секрет (SHA1)
- createTime (временная метка)
- обратный вызов
AccessTokens
- токен (MD5, первичный ключ)
- секрет (SHA1)
- consumerKey
- userID (относится к владельцу ресурса)
- createTime
Потребители (зарегистрированные сторонние приложения)
- consumerKey (MD5, первичный ключ)
- userSecret (SHA1)
- userID (относится к разработчику, который зарегистрировал приложение, а не уникально)
- описание (текст для описания приложения)
- name (имя приложения)
- обратный вызов
UsedNonces
Обработка nonces была для меня самым большим вопросом дизайна. OAuth советует вам никогда не разрешать использовать тот же самый nonce с той же меткой времени. Но это создало бы бесконечно огромную базу данных. Я думаю, что большинство провайдеров отбирают старые ноты хотя бы раз в то время.
Я регулярно очищаю nonces старше 5 минут, исходя из предпосылки, что все запросы с отметкой времени старше 5 минут отклоняются. Я немного прощаю при проверке временных меток, они должны быть UTC и не старше 5 минут, а не раньше моего времени сервера более одной минуты.
Ответ 2
Есть несколько способов приблизиться к этому, один пример приложения, реализующего функциональность как поставщика, так и потребителя, - это Atlassian Jira - вот их структура:
<prim-key field="id"/>
<index name="oauth_consumer_token_key_index" unique="true">
<index-field name="tokenKey"/>
</index>
<index name="oauth_consumer_token_index">
<index-field name="token"/>
</index>
</entity>
<entity entity-name="OAuthConsumer" table-name="oauthconsumer" package-name="">
<field name="id" type="numeric"/>
<field name="created" type="date-time"/>
<field name="name" col-name="consumername" type="long-varchar"/>
<field name="consumerKey" type="long-varchar"/>
<field name="service" col-name="consumerservice" type="long-varchar"/>
<field name="publicKey" type="very-long"/>
<field name="privateKey" type="very-long"/>
<field name="description" type="very-long"/>
<field name="callback" type="very-long"/>
<field name="signatureMethod" type="short-varchar"/>
<field name="sharedSecret" type="very-long"/>
<prim-key field="id"/>
<index name="oauth_consumer_index" unique="true">
<index-field name="consumerKey"/>
</index>
<index name="oauth_consumer_service_index" unique="true">
<index-field name="service"/>
</index>
</entity>
<!-- OAUTH ServiceProvider-->
<entity entity-name="OAuthServiceProviderConsumer" table-name="oauthspconsumer" package-name="">
<field name="id" type="numeric"/>
<field name="created" type="date-time"/>
<field name="consumerKey" type="long-varchar"/>
<field name="name" col-name="consumername" type="long-varchar"/>
<field name="publicKey" type="very-long"/>
<field name="description" type="very-long"/>
<field name="callback" type="very-long"/>
<prim-key field="id"/>
<index name="oauth_sp_consumer_index" unique="true">
<index-field name="consumerKey"/>
</index>
</entity>
<entity entity-name="OAuthServiceProviderToken" table-name="oauthsptoken" package-name="">
<field name="id" type="numeric"/>
<field name="created" type="date-time"/>
<field name="token" type="long-varchar"/>
<field name="tokenSecret" type="long-varchar"/>
<field name="tokenType" type="short-varchar"/>
<field name="consumerKey" type="long-varchar"/>
<field name="username" type="long-varchar"/>
<field name="ttl" type="numeric"/>
<field name="auth" col-name="spauth" type="short-varchar"/>
<field name="callback" type="very-long"/>
<field name="verifier" col-name="spverifier" type="long-varchar"/>
<field name="version" col-name="spversion" type="short-varchar"/>
<prim-key field="id"/>
<index name="oauth_sp_token_index" unique="true">
<index-field name="token"/>
</index>
<index name="oauth_sp_consumer_key_index">
<index-field name="consumerKey"/>
</index>
</entity>
Обычно основы имитируют спецификацию - за исключением настраиваемых расширений, с которыми вы можете столкнуться:
- Ограничения IP-адреса
- Время жить для токена
- Разрешение на обновление/обновление токенов
- Список продолжается...