【发布时间】:2015-09-22 17:29:03
【问题描述】:
为什么在 Brent Shaffer 的 this OAuth database scheme 中,client_secret 列不允许为空 (client_secret VARCHAR(80) NOT NULL)?这是有效 OAuth 数据库架构的通用配置吗?
OAuth2-Server 模块也可以在on GitHub 中找到,也可以在in the PDO scheme there 中找到,client_secret 列设置为NOT NULL。
CREATE TABLE oauth_clients (
client_id VARCHAR(80) NOT NULL,
client_secret VARCHAR(80) NOT NULL,
redirect_uri VARCHAR(2000) NOT NULL,
grant_types VARCHAR(80),
scope VARCHAR(100),
user_id VARCHAR(80),
CONSTRAINT clients_client_id_pk PRIMARY KEY (client_id)
);
拥有不需要密码的公共客户端是很常见的。我看到人们在这种情况下设置了一个空字符串(''),但null 值对我来说似乎更干净。
在这种情况下是否有特殊原因禁止空值?
【问题讨论】:
-
注意:公共客户端不是没有密码的密码客户端。这个服务器似乎只支持密码客户端,所以如果你创建一个没有密码的密码客户端,你可能会遇到安全问题。例如,此客户端可用于使用客户端凭据授予类型颁发访问令牌。
-
@FlorentMorselli 我不太理解您的评论,它究竟是如何成为安全风险的?您能否详细说明答案,或者您能否分享一个参考资料,让我可以阅读更多关于此问题的信息?
-
例如#1:根据 RFC6749,公共客户端在使用授权码响应类型时必须注册一个重定向 URI。但不是机密客户。如果你的服务器知道你的客户端是机密的,那么它在收到redirect_uri='my.evil-sever.com/callback'的授权请求时不会返回错误。资源所有者授予您的客户端,但被重定向到my.evil-sever.com/callback。然后我的邪恶服务器可以发出访问令牌。
-
例如#2:公共客户端不能使用客户端凭据授予类型-CCGT-,因为它们没有凭据。但是如果您的密码客户端没有密码,那么任何知道您的客户端 ID(很容易知道:它是公开的)的恶意客户端都可以尝试使用 CCGT 获取访问令牌(如果您的客户端显然被允许使用此授权类型)。
-
总结:不,
client_secret=NULL不好。仅当您的服务器要求客户端至少在重定向 URI 上注册(请参阅tools.ietf.org/html/rfc6749#section-3.1.2.2)并且不允许这些客户端使用 CCGT
标签: php oauth-2.0 client database-schema