OAuth提供商的推荐数据库结构
-
13-10-2019 - |
题
我正在使用DevDevined Library实施OAuth提供商。
我想知道是否有任何推荐的数据库结构用于将消费者和令牌数据存储在服务器端。
对此的任何建议将不胜感激。
解决方案
NB:以下答案主要适用于OAuth 1.0
我真的不知道DevDevined Library。但这是我最终使用SQL数据库在最新项目中与数据库设计的非技术描述。
它应该涵盖遵循基本规范所需的一切。我试图将其降至绝对最低限度。
RequestTokens
- 令牌(我在这里使用MD5,主键)
- 消费者(用于消费者的唯一标识符)
- 秘密(SHA1)
- 创作(时间戳)
- 打回来
AccessTokens
- 令牌(MD5,主键)
- 秘密(SHA1)
- 消费者
- 用户ID(指资源所有者)
- createTime
消费者 (注册第三方申请)
- 消费者(MD5,主键)
- commuterSecret(SHA1)
- USERID(指注册该应用程序的开发人员,而不是唯一)
- 描述(描述应用程序的文本)
- 名称(应用程序的名称)
- 打回来
二手
- nonce
- 时间戳
对我来说,处理Nonces确实是最大的设计问题。 Oauth告诉您,再也不会允许与同一时间戳一起使用相同的NONCE。但这将构成一个无限巨大的数据库。我认为大多数提供商至少偶尔会批量销售旧的Nonces。
我通常会根据以下前提来清除超过5分钟的Nonces。在检查时间戳时,我有些宽容,他们需要年龄在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>
通常,基础知识模仿规范 - 除了您可能引入的自定义扩展名外:
- IP地址限制
- 是时候为代币而生
- 允许刷新/更新代币
- 列表继续...
不隶属于 StackOverflow