如何限制用户仅使用特定客户端登录?

3
我是一位能翻译文本的助手。

我有一个资源服务器和几个实现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).

我有一个数据库,其中包含一些表。

enter image description here

一切都非常顺利。我需要什么?oauth_client_details(应用程序表)和users之间没有逻辑关系,因此任何注册用户都可以访问任何已注册的客户端。
我需要限制用户只能访问我选择的应用程序。
奖励:有人能告诉我我正在使用的正确OAuth流名称吗?
1个回答

2
很遗憾,您描述的流程与OAuth 2规范定义的任何流程不完全匹配。
按照OAuth 2.0协议,授权请求的HTTP POST是有效的。但是我没有看到在授权请求中发送客户端凭据。
我能想到的最接近的是客户端凭据授权,但是该流程中没有步骤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,检查此表以查找现有记录以允许发出令牌。您必须以某种方式向此表添加和删除条目,这可能是配置步骤。

谢谢回复。我几乎失去了希望。我想我犯了一个错误。我的意思是“授权服务器”,而不是“资源服务器”。我从某个例子中得到了这个。也许原始编码者也想保护客户端访问.. 无论如何,如果我们把客户端的“登录”放在一边,你能猜出什么吗?我知道如何链接表,但如何告诉Spring只接受与请求客户端相关联的有效用户?每个人的身份验证都在Spring的不同位置进行。 - Magno C
@MagnoC 嗯,我也猜到了,并且假设你在谈论授权服务器。有人可能会认为这是隐式流程(https://tools.ietf.org/html/rfc6749#section-4.2)。但是,正如你所提到的,它没有客户端身份验证步骤。因此,我仍然认为这是一种自定义实现。但是,正如你所说,如果忘记客户端身份验证,则可以将其视为隐式流程(请阅读规范以获取想法)。 - Kavindu Dodanduwa
我认为“不同的地方”指的是不同的servlet。如果是这样,您必须在将请求从一个servlet转发到另一个servlet之前使用请求属性。由于您首先处理客户端身份验证,因此必须在那里提取客户端ID并通过请求转发到下一个servlet。因此,在执行最终用户身份验证时,您必须首先验证凭据,然后将客户端ID和用户ID与您的表进行组合。 - Kavindu Dodanduwa
1
好主意。我很快就会尝试。我已经在代码的其他部分获取了客户端ID,以向用户展示应用程序正在请求他的凭据。由于用户无法“看到”客户端登录过程,我认为这可能是一个好主意。它似乎有点像“使用Google登录”的过程。不同之处在于客户端不像你所说的那样登录到Google,而是我们必须在我们的帐户中插入客户端详细信息,包括重定向URL。非常接近我正在做的事情。 - Magno C
1
你非常聪明。我希望将来在与Spring相关的问题上能够依靠你。由于我正在做一些“曲线救国”的事情,我的问题没有得到太多关注,而且我的声望点数也快用完了 :-( - Magno C
@MagnoC 很高兴能帮助您解决这个问题。是的,我会看一下它们 :) - Kavindu Dodanduwa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接