OAuth提供程序的推荐数据库结构

时间:2010-12-26 15:26:00

标签: database-design oauth oauth-provider devdefined-oauth

我正在使用DevDefined库实现OAuth提供程序。

我想知道是否有任何推荐的数据库结构用于在服务器端存储使用者和令牌数据。

对此有任何建议将不胜感激。

2 个答案:

答案 0 :(得分:26)

注意:以下答案主要适用于OAuth 1.0

我对DevDefined库一无所知。但是这里是我最近使用SQL数据库在最新项目中使用的数据库设计的非技术性描述。

它应涵盖遵循基本规范所需的一切。我试图把它降到最低限度。

<强> RequestTokens

  • 令牌(我在这里使用MD5,主键)
  • consumerKey(消费者的唯一标识符)
  • secret(SHA1)
  • createTime(timestamp)
  • 回调

<强> AccessTokens

  • 令牌(MD5,主键)
  • secret(SHA1)
  • consumerKey
  • userID(指资源所有者)
  • createTime

消费者(已注册的第三方应用程序)

  • consumerKey(MD5,主键)
  • consumerSecret(SHA1)
  • userID(指的是注册应用程序的开发人员,而不是唯一的)
  • 描述(描述申请的文字)
  • name(应用程序的名称)
  • 回调

<强> UsedNonces

  • 随机数
  • 时间戳

对于我来说,对nonces的处理真的是最大的设计问题。 OAuth告诉您永远不要让同一个nonce再次使用相同的时间戳。但这将成为一个无限庞大的数据库。我认为大多数供应商至少会偶尔批发旧的nonces。

我会定期清除超过5分钟的nonce,其前提是所有时间戳超过5分钟的请求都会被拒绝。在检查时间戳时我有点宽容,它们需要是UTC并且不超过5分钟,并且不超过我的服务器时间超过一分钟。

答案 1 :(得分: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地址限制
  • 生存令牌的时间
  • 允许刷新/续订令牌
  • 列表继续......