我正在使用 DevDefined 库实现 OAuth 提供程序。
我想知道是否有任何推荐的数据库结构用于在服务器端存储消费者和令牌数据。
对此的任何建议将不胜感激。
我正在使用 DevDefined 库实现 OAuth 提供程序。
我想知道是否有任何推荐的数据库结构用于在服务器端存储消费者和令牌数据。
对此的任何建议将不胜感激。
注意:以下答案主要适用于 OAuth 1.0
我对 DevDefined 库一无所知。但这里是对我在最新项目中最终使用的数据库设计的非技术描述,使用的是 SQL 数据库。
它应该涵盖遵循基本规范所需的一切。我试图将其降低到绝对最低限度。
请求令牌
访问令牌
消费者(注册的第三方应用程序)
使用Nonce
对我来说,nonce 的处理确实是最大的设计问题。OAuth 告诉您永远不要再让相同的 nonce 与相同的时间戳一起使用。但这将形成一个无限大的数据库。我认为大多数提供商至少不时地批量处理旧的随机数。
我通常会清除超过 5 分钟的 nonce,前提是所有时间戳超过 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>
通常,基础知识模仿规范 - 除了您可能引入的自定义扩展来处理: