Spring boot 使用Spring Boot和OAUTH2的授权服务器内的单个登录页

Spring boot 使用Spring Boot和OAUTH2的授权服务器内的单个登录页,spring-boot,spring-security-oauth2,spring-oauth2,Spring Boot,Spring Security Oauth2,Spring Oauth2,我需要一个OAUTH2身份验证服务器用于我的单页Web应用程序。我能够使用Spring Boot构建支持授权类型密码的OAuth2身份验证服务器。但是Spring需要一个客户端密码来在/auth/token端点上进行基本身份验证。我知道这不安全,任何人都可以从JS代码中提取客户端机密。所以我想知道如何在不泄露客户秘密的情况下做到这一点。此外,我希望我的每个SPA都没有自己的登录页面,但在auth服务器中有一个登录页面,我的SPA用户将被重定向到该页面,并且在登录后将被重定向回该页面。我知道这是常

我需要一个OAUTH2身份验证服务器用于我的单页Web应用程序。我能够使用Spring Boot构建支持授权类型密码的OAuth2身份验证服务器。但是Spring需要一个客户端密码来在/auth/token端点上进行基本身份验证。我知道这不安全,任何人都可以从JS代码中提取客户端机密。所以我想知道如何在不泄露客户秘密的情况下做到这一点。此外,我希望我的每个SPA都没有自己的登录页面,但在auth服务器中有一个登录页面,我的SPA用户将被重定向到该页面,并且在登录后将被重定向回该页面。我知道这是常见的情况,但我找不到如何使用SpringBoot实现这一点的教程。非常感谢您的建议。

对于web应用程序这样的公共客户端,您可以在基本身份验证头中输入一个空密码。例如,如果移动应用程序客户端id为
abcd
(在生产中使用长随机字符串),则可以使用Base64编码的
abcd:
。标题将是
Authorization:Basic ywjjjzdo=
其中
YWJjZDo=
->Base64(“abcd:”)。
事实上,您可以将任何内容作为基本身份验证密码,如果您不将
client\u secret
分配给您的客户端,授权服务器将不会检查它

您应该仅为您自己的应用程序使用密码授权(切勿授予您的合作伙伴收集您自己用户凭据的权利) 当隐性授权不能为您提供足够好的用户体验时——例如,如果您不希望您的移动应用程序从本机用户界面切换到浏览器

单页web应用程序是赠款的最佳使用案例

在授权服务器中,确保web应用程序客户端详细信息具有一个
授权授予类型
,其中包含
隐式
,以及一个
重定向uri
,该uri等于将在进程结束时接收令牌的端点。在单页应用程序中,当授权服务器将用户重定向回您的页面时,您应该有一些处理程序可以在URL中提取访问令牌

从您的网页,您必须将用户重定向到
https://your-authz-server/oauth/authorize?response_type=token&client_id=$CLIENT\u ID\u YOU\u JUST\u CONFIGURED&redirect\u uri=$YOUR\u APPLICATION\u PAGE

一旦用户授予对您的应用程序的访问权限,他将被发送回您的重定向URI,并带有一个
access\u令牌
参数,您可以在URL中获取该参数。
注意:在生产过程中,您应该始终为使用
隐式
授权
授权的客户端设置固定的
重定向(uri)
s。对于
隐式
授权,这是让攻击者更难从用户处获取令牌的唯一方法

如果不希望自己的用户看到自己的站点所需的作用域(权限)列表,则可以将客户端设置为具有预先验证的作用域。这样,您的用户就可以登录并使用令牌直接重定向到您的应用程序页面,而无需查看OAuth 2.0 plumbering

请注意,授权服务器提供默认登录页面,但您可以使用映射到
/oauth/authorize
上的经典Spring MVC
@Controller
对其进行自定义,并使用您喜欢的模板引擎(thymeleaf、velocity、jsp…)实现视图。您还可以使用classic Spring Security自定义登录页面,确保只处理
/oauth/authorize
路径上的请求

查看Spring Security OAuth 2.0开发人员提供的这篇优秀教程:

这里有详细的解释: