Подтвердить что ты не робот

Рекомендуемая структура базы данных для провайдера OAuth

Я реализую OAuth-провайдер, используя библиотеку DevDefined.

Интересно, существует ли какая-либо рекомендуемая структура базы данных для хранения данных о потребителях и токенах на стороне сервера.

Любые советы по этому вопросу будут оценены.

4b9b3361

Ответ 1

Примечание. Ответ ниже применим в основном к OAuth 1.0

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

Он должен охватывать все необходимое, чтобы следовать базовой спецификации. Я пытался довести его до абсолютного минимума.

RequestTokens

  • (я использую MD5 здесь, первичный ключ)
  • consumerKey (уникальный идентификатор для потребителя)
  • секрет (SHA1)
  • createTime (временная метка)
  • обратный вызов

AccessTokens

  • токен (MD5, первичный ключ)
  • секрет (SHA1)
  • consumerKey
  • userID (относится к владельцу ресурса)
  • createTime

Потребители (зарегистрированные сторонние приложения)

  • consumerKey (MD5, первичный ключ)
  • userSecret (SHA1)
  • userID (относится к разработчику, который зарегистрировал приложение, а не уникально)
  • описание (текст для описания приложения)
  • name (имя приложения)
  • обратный вызов

UsedNonces

  • нонс
  • timestamp

Обработка 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-адреса
  • Время жить для токена
  • Разрешение на обновление/обновление токенов
  • Список продолжается...