Я реализую OAuth-провайдер, используя библиотеку DevDefined.
Интересно, существует ли какая-либо рекомендуемая структура базы данных для хранения данных о потребителях и токенах на стороне сервера.
Любые советы по этому вопросу будут оценены.
Я реализую OAuth-провайдер, используя библиотеку DevDefined.
Интересно, существует ли какая-либо рекомендуемая структура базы данных для хранения данных о потребителях и токенах на стороне сервера.
Любые советы по этому вопросу будут оценены.
Примечание. Ответ ниже применим в основном к OAuth 1.0
Я ничего не знаю о библиотеке DevDefined. Но вот нетехническое описание дизайна базы данных, в котором я работал в своем последнем проекте, используя базу данных SQL.
Он должен охватывать все необходимое, чтобы следовать базовой спецификации. Я пытался довести его до абсолютного минимума.
RequestTokens
AccessTokens
Потребители (зарегистрированные сторонние приложения)
UsedNonces
Обработка nonces была для меня самым большим вопросом дизайна. OAuth советует вам никогда не разрешать использовать тот же самый nonce с той же меткой времени. Но это создало бы бесконечно огромную базу данных. Я думаю, что большинство провайдеров отбирают старые ноты хотя бы раз в то время.
Я регулярно очищаю nonces старше 5 минут, исходя из предпосылки, что все запросы с отметкой времени старше 5 минут отклоняются. Я немного прощаю при проверке временных меток, они должны быть UTC и не старше 5 минут, а не раньше моего времени сервера более одной минуты.
Есть несколько способов приблизиться к этому, один пример приложения, реализующего функциональность как поставщика, так и потребителя, - это 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>
Обычно основы имитируют спецификацию - за исключением настраиваемых расширений, с которыми вы можете столкнуться: