分离OAuth2授权服务器和资源服务器
Separating OAuth2 Authorization Server and Resource Server
我正在实施 OAuth2 授权服务器和资源服务器。
而且有很多文档告诉我
'Authorization Server and Resource Server can be Separated or not'
我喜欢 MSA,所以我决定分离这些服务器。
我在网上看到了很多关于这个问题的文档,但是我无法在实践中继续下去。
我正在使用 SpringBoot2。
- 场景
- 用户连接到我的
Client
应用程序。
- 请求安全端点
/client/me
- 在
Client
的控制器中,如果用户没有通过身份验证,则重定向到Authorization Server
的登录端点/auth/oauth/authorize
。
- 如果用户首先进入我的
Client
应用程序,用户将在我的 Authorization Server
. 中注册(而不是登录)
- 在
Authorization Server
的注册页面,用户将输入他的username
、realusername
、password
和email
。
- 用户的帐户已发布,用户将通过我的
Authorization Server
的登录表单登录。
- 如果登录成功,
Client
将请求 Resource Server
的 /me
端点 access-token
,Resource Server
的控制器映射为 /me
将 return Principal
或 Authentication
对象作为 REST API.
Client
会将 REST API 的结果绑定到 DefaultOAuth2User
或 CustomOAuth2User
在我的 SecurityContext
.
这里是问题。
据我所知,Resource Server
的 /me
端点将提供用户的资源。
例如,真实姓名或电子邮件等
但用户已在 Authorization Server
中注册,因此所有信息都保存在 Authorization Server
的数据库中。
我的 oauth2 服务器是 MSA。所以数据库也被分离了。
那么,如何通过Resource Server
的[将email
或realname
设置为Principal
或Authentication
或CustomOAuth2User
对象/me
端点?
授权服务器负责验证用户或客户端(其他应用程序),检查他们是否被授权做他们想做的事,如果成功,它会发出一个令牌。这意味着它连接到的数据库应该具有所有用户凭据、客户端 ID、客户端机密、角色和其他有助于身份验证和授权的相关信息。
资源服务器负责处理来自前端的所有请求,无论是经过身份验证的请求还是打开的请求(不需要身份验证)。它连接的数据库应该包含与身份验证无关的信息,例如用户的性别、身高、体重、爱好等。
要回答您的问题,您可以在资源服务器中创建控制器来公开注册和其他功能。然后该服务器将调用授权服务器。对于注册,Resource Server 会将凭据传递给 Auth Server,以查看用户名是否已声明,如果未注册用户,则根据 Auth Server 的响应,Resource Server 将继续进行用户注册。对于登录,前端可以直接调用Auth Server获取token。
对于所有对受保护资源的后续调用(使用访问令牌),资源服务器将需要调用 Auth 服务器来验证令牌。为此 Spring 提供 CheckTokenEndpoint (/oauth/check_token
).
您也可以检查OAuth2RestTemplate。这可以在 Resource Server 中用于向 Auth Server 发出 REST 请求。请注意,资源服务器(或您拥有的任何其他内部应用程序,如前端)将成为 Auth Server 的客户端。他们还需要对自己进行身份验证和授权。
我正在实施 OAuth2 授权服务器和资源服务器。
而且有很多文档告诉我 'Authorization Server and Resource Server can be Separated or not'
我喜欢 MSA,所以我决定分离这些服务器。
我在网上看到了很多关于这个问题的文档,但是我无法在实践中继续下去。
我正在使用 SpringBoot2。
- 场景
- 用户连接到我的
Client
应用程序。 - 请求安全端点
/client/me
- 在
Client
的控制器中,如果用户没有通过身份验证,则重定向到Authorization Server
的登录端点/auth/oauth/authorize
。 - 如果用户首先进入我的
Client
应用程序,用户将在我的Authorization Server
. 中注册(而不是登录)
- 在
Authorization Server
的注册页面,用户将输入他的username
、realusername
、password
和email
。 - 用户的帐户已发布,用户将通过我的
Authorization Server
的登录表单登录。 - 如果登录成功,
Client
将请求Resource Server
的/me
端点access-token
,Resource Server
的控制器映射为/me
将 returnPrincipal
或Authentication
对象作为 REST API. Client
会将 REST API 的结果绑定到DefaultOAuth2User
或CustomOAuth2User
在我的SecurityContext
.
- 用户连接到我的
这里是问题。
据我所知,Resource Server
的 /me
端点将提供用户的资源。
例如,真实姓名或电子邮件等
但用户已在 Authorization Server
中注册,因此所有信息都保存在 Authorization Server
的数据库中。
我的 oauth2 服务器是 MSA。所以数据库也被分离了。
那么,如何通过Resource Server
的[将email
或realname
设置为Principal
或Authentication
或CustomOAuth2User
对象/me
端点?
授权服务器负责验证用户或客户端(其他应用程序),检查他们是否被授权做他们想做的事,如果成功,它会发出一个令牌。这意味着它连接到的数据库应该具有所有用户凭据、客户端 ID、客户端机密、角色和其他有助于身份验证和授权的相关信息。
资源服务器负责处理来自前端的所有请求,无论是经过身份验证的请求还是打开的请求(不需要身份验证)。它连接的数据库应该包含与身份验证无关的信息,例如用户的性别、身高、体重、爱好等。
要回答您的问题,您可以在资源服务器中创建控制器来公开注册和其他功能。然后该服务器将调用授权服务器。对于注册,Resource Server 会将凭据传递给 Auth Server,以查看用户名是否已声明,如果未注册用户,则根据 Auth Server 的响应,Resource Server 将继续进行用户注册。对于登录,前端可以直接调用Auth Server获取token。
对于所有对受保护资源的后续调用(使用访问令牌),资源服务器将需要调用 Auth 服务器来验证令牌。为此 Spring 提供 CheckTokenEndpoint (/oauth/check_token
).
您也可以检查OAuth2RestTemplate。这可以在 Resource Server 中用于向 Auth Server 发出 REST 请求。请注意,资源服务器(或您拥有的任何其他内部应用程序,如前端)将成为 Auth Server 的客户端。他们还需要对自己进行身份验证和授权。