我有一个资源服务器和一些实现Oauth2安全性的客户端。

我正在使用的流程是(我不知道正确的名称):

1) The resource owner try to access a web application (client and resource server).
2) This web application can't even show the index page so the resource owner is redirected
     to the OAuth2 (Authorization) server passing a client_id and a password in a Basic Auth POST.
3) The Authorization server show a login page and the user enter the username and password.
4) The Authorization server send the user back to the web application and he can
     access the resources (web pages).


我有一个带有一些表的数据库。

spring-security - 如何限制用户仅使用选定的客户端登录?-LMLPHP

一切都很好。我需要的? oauth_client_details(应用程序表)和users之间没有逻辑关系,因此任何注册用户都可以访问任何注册客户端。

我需要限制用户只能访问我选择的应用程序。

奖励:有人可以告诉我我使用的正确的OAuth流名称吗?

最佳答案

不幸的是,您对流的描述与OAuth 2规范定义的任何流都不完全匹配。

授权请求的HTTP POST由OAuth 2.0协议有效。但是我还没有看到在授权请求中发送客户端凭据。

最近,我猜这是Client Credentials Grant,但是在此流程中也没有第3步。因此,我认为您使用的是组织定义的流程。

现在,当涉及到与最终用户的客户端应用程序关联时,我认为您需要另一个表来存储客户端应用程序和用户标识符映射。如果对特定的最终用户身份启用了请求客户端应用程序,则OAuth服务器必须仅颁发令牌。我不是数据库专家,但表如下所示

**Oauth_cliet_details_tab**
---------------------------------------------------
| Client_ID | Client_Secret | Redirect_URL | etc..|
---------------------------------------------------


**Users_tab**
--------------------------------------------------------
|User_ID | User_Name | Email | Hashed_Salted_PWD| etc...
--------------------------------------------------------


现在,您的客户端应用程序权限标签应如下所示

 **User_client_permisison_tab**
 ----------------------
 |User_ID | Client_ID |
 ----------------------


请注意,UserID是来自Users_tab的外键,而Client_ID是来自Oauth_cliet_details_tab的外键。 User_IDClient_ID都创建一个复合主键。

因此,当您的OAuth服务器收到请求时,您必须验证客户端凭据,最终用户凭据,然后使用客户端ID和最终用户ID,您必须在此表中查找现有记录以允许发布令牌。您必须以某种方式在此表中添加和删除条目,这可能是配置步骤。

07-27 17:31