19

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

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

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

4

2 回答 2

28

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

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

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

请求令牌

  • 令牌(我在这里使用 MD5,主键)
  • consumerKey(消费者的唯一标识符)
  • 秘密(SHA1)
  • 创建时间(时间戳)
  • 打回来

访问令牌

  • 令牌(MD5,主键)
  • 秘密(SHA1)
  • 消费者密钥
  • userID(指资源所有者)
  • 创建时间

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

  • consumerKey(MD5,主键)
  • 消费者秘密 (SHA1)
  • userID(指注册应用的开发者,不是唯一的)
  • 描述(描述应用程序的文本)
  • 名称(应用程序的名称)
  • 打回来

使用Nonce

  • 随机数
  • 时间戳

对我来说,nonce 的处理确实是最大的设计问题。OAuth 告诉您永远不要再让相同的 nonce 与相同的时间戳一起使用。但这将形成一个无限大的数据库。我认为大多数提供商至少不时地批量处理旧的随机数。

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

于 2010-12-30T23:32:04.840 回答
3

有几种方法可以解决这个问题,实现提供者和消费者功能的应用程序的一个示例是 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 地址限制
  • 为令牌而活
  • 允许刷新/更新令牌
  • 名单还在继续……
于 2010-12-27T22:13:32.093 回答