共计 3269 个字符,预计需要花费 9 分钟才能阅读完成。
解释 OAuth2 技术
正如我所说,我们将使用 OAuth2 协议,因此首先要解释这个协议是如何工作的。
OAuth2 有一些变体,但我将解释我将在程序中使用的内容,为此,我将给你一个例子,以便你了解我们打算做什么。
举个例子,在商店里用信用卡付款。在这种场景下,有三个角色:商店、银行和我们。OAuth2 协议中也发生了类似的事情,就像这样:
1. 客户或买方需要银行提供信用卡。然后,银行将收集我们的信息,核实我们是谁,并根据我们帐户中的资金向我们提供信用卡或者直接拒绝我们。在授予卡的 OAuth2 协议中,它称为身份验证服务器。
2. 如果银行给了我们卡,我们可以去商店,即网络服务器,我们提供信用卡。商店不欠我们任何东西,但他们可以通过读卡器向银行询问他们是否可以信任我们以及信用余额(信用余额)。商店是资源服务器。
3. 商店,根据银行说我们拥有的钱,将允许我们购买。在 OAuth2 类比中,Web 服务器将允许我们访问页面,具体取决于我们的财务状况。
如果您没有注意到通常使用身份验证服务器,当您转到网页并被要求注册时,它允许您通过 Facebook 或 Google 进行。Facebook 或 Google 成为发行“卡”的“银行”,并会验证您的“信用”是否足够支付这个商品。
您可以看到“El Pais”的网站并创建一个帐户。如果我们使用 Google 或 Facebook,这个商店将依赖这些身份验证提供商提供的客户身份信息。在这种情况下,网站唯一需要的是拥有信用卡 – 无论余额如何
创建授权服务器
现在,让我们看看如何创建银行、商店以及您需要的所有其他内容。
首先,在我们的项目中,我们需要具有适当的依赖关系。我们需要启动者:Cloud OAuth2,Security 和 Web。
那么,让我们从定义银行开始; 这就是我们之前说的:AuthorizationServerConfiguration:
我们从 @ Configuration 标签开始,然后使用 @EnableAuthorizationServer 标记告诉 Spring 激活授权服务器。要定义服务器属性,我们指定我们的类扩展 AuthorizationServerConfigurerAdapter,实现了 AuthorizationServerConfigurerAdapter 接口,所以 Spring 将使用这个类来参数化服务器。
我们定义了一个 Spring 自动提供的 AuthenticationManager,我们将使用它来收集 @Autowired 标签。我们还定义了一个 TokenStore 对象,作为 public 的功能。
虽然 AuthenticationManager 由 Spring 提供的,但我们必须自己配置它。我等等解释要如何完成这个配置。TokenStore 或者 IdentifierStore 是身份验证服务器提供的标识符将存储的位置,因此当资源服务器(商店)要求信用卡上的信息时,身份验证服务器就要响应它。在这种情况下,我们使用 InMemoryTokenStore 将标识符存储在内存中的类。在实际应用中,我们可以使用 JdbcTokenStore 将它们保存在数据库中,以便在应用程序发生故障时,客户端不必更新其信用卡。
在功能配置中 (ClientDetailsServiceConfigurer clients),我们指定银行的凭证,包括身份验证的管理员,以及提供的服务。因为要访问银行,我们必须为每个提供的服务提供用户名和密码。这是一个非常重要的概念:用户名和密码来自银行,而不是客户。对于银行提供的每项服务,将进行单一认证,但对于不同的服务可能相同。
我将详细说明这些内容:
clients.inMemory ()指定我们将服务存储在内存中。在“真正的”应用程序中,我们将其保存在数据库,LDAP 服务器等中。
withClient (“client”)是我们将在银行中识别的用户。在这种情况下,它将被称为“客户端”。将他称为“用户”会不会更好?
要 uthorizedGrantTypes (“password”, “authorization_code”, “refresh_token”, “implicit”),我们指定配置定义的用户,对服务“客户端”。在我们的示例中,我们将仅使用密码服务。
authorities (“ROLE_CLIENT”, “ROLE_TRUSTED_CLIENT”, “USER”) 指定所提供服务包含的角色或组。我们也不会在我们的例子中使用它,所以让我们让它暂时运行。
scopes (“read”, “write”) 是服务的范围 – 我们也不会在我们的应用程序中使用它。
autoApprove (true)- 如果您必须自动批准客户的请求,我们会说是,以使应用程序更简单。
secret (passwordEncoder (). encode (“password”)) 是客户端的密码。请注意,调用我们稍后定义的编码函数来指定密码将保存在何种类型的加密中。的编码功能进行注释与 @Bean 标签因为 Spring,当我们在 HTTP 请求中提供密码时,会查找一个 PasswordEncoder 对象检查交付密码的有效性。
最后,我们有一个函数 configure (AuthorizationServerEndpointsConfigurer endpoints),我们定义哪个身份验证控制器和标识符存储应该使用端点。澄清终点是我们将与我们的“银行”联系以请求卡的 URL。
现在,我们已经创建了我们的身份验证服务器,但是根据引入的凭据,我们仍然需要他知道我们是谁并将我们放在不同的组中的方式。好吧,为此,我们将使用与保护网页相同的类。
现在,我们可以检查我们的授权服务器是否有效。让我们看看如何使用优秀的 PostMan 程序。
我们将使用 HTTP 请求类型 POST,表明我们要使用基本验证。在我们的示例中,我们将分别使用“client”和“password”来设置用户和密码,即“银行”的密码。
在请求正文和 form-url 编码格式中,我们将介绍要请求的服务,用户名和密码。
‘access_token’“8279b6f2-013d-464a-b7da-33fe37ca9afb”是我们的信用卡,是我们必须提供给我们的资源服务器(商店)以查看非公开的页面(资源)的信用卡。
创建资源服务器(ResourceServer)
现在我们有了信用卡,我们将创建接受该卡的商店。
在我们的示例中,我们将使用 Spring Boot 在相同的程序中创建资源和身份验证服务器,它无需配置任何内容。如果像现实生活中一样,资源服务器在一个地方,而身份验证服务器在另一个地方,我们应该向资源服务器指出哪个是我们的“银行”以及如何与之交谈。但是,我们将把它留给另一个条目。
资源服务器的唯一类是 ResourceServerConfiguration:
由于身份验证和资源服务器在同一个程序中,我们只需要配置资源服务器的安全性。这是在函数中完成的:
一旦我们创建了资源服务器,我们必须只创建服务,这些服务是通过这些行完成的:
现在让我们看看验证的工作原理。
首先,我们检查我们是否可以在没有任何验证的情况下访问“/ publica”:
如果我尝试访问“/ private”页面,则会收到错误“401 unauthorized”,表示我们无权查看该页面,因此我们将使用我们的授权服务器给用户授权。
如果我们可以看到我们的私人页面,那么让我们尝试管理员的页面:
我们当然没办法看到管理员的界面。因此,我们将要求凭据管理员提供新令牌,但要向用户“管理员”表明身份。
返回的令牌是:“ab205ca7-bb54-4d84-a24d-cad4b7aeab57。”这样就没问题了,我们可以安全地去购物!现在,我们只需要设置商店并拥有产品。
本人创业团队产品 MadPecker,主要做 BUG 管理、测试管理、应用分发,有需要的朋友欢迎试用、体验!
本文为 MadPecker 团队产品经理译制,转载请标明出处