基于OAuth2和Spring Boot的通信应用_第1页
基于OAuth2和Spring Boot的通信应用_第2页
基于OAuth2和Spring Boot的通信应用_第3页
基于OAuth2和Spring Boot的通信应用_第4页
基于OAuth2和Spring Boot的通信应用_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于OAuth2和Spring Boot的端到端通信应用 利用OAuth2.0来构建一个基于Spring Boot的安全的端到端通信应用如何利用OAuth2.0客户端授权方式来构建一个端到端的Spring Boot应用呢?前言: 大多数OAuth2.0的指引都以用户为出发点,例如,通过Google,Github,Okta等等方式登录。虽然这可能会很有用,但是它忽略了服务器到服务器的通信(这里没有用户),并且你只有一个服务连接到另一个服务器,Okta在这里帮助你实现有关这一块的应用安全。OAuth2.0客户端授权方式专门应用于无用户场景的认证方式,例如CRON任务,计划任务,其他的数据工作负载等

2、。由于没有终端用户或者浏览器介入,这种方式授权比其他的OAuth授权方式更加少见。但是,相比于复杂的以用户为中心的OAuth2.0授权模式,这种方式更加容易理解。在这片文章中,我将介绍OAuth2.0客户端授权协议,并且讲授如何在Spring Boot中应用它实现一个安全的服务端到服务端的通信。OAuth 2.0客户端授权客户端授权模式的目的是允许两个机器中间安全的通信。在这个模式中,你有一个端(可以认为是你的应用)向另一个应用发起API请求(可以认为是你的资源服务器)。 为了帮助说明这样模式的重要性, 让我们先穿越一下,看看在AAuth2.0以前我们是如何实现上述通信的。Note:如果你已经

3、对OAuth 2.0有了一定了解,你可以跳过这一节,直接进入到下一段代码示例部分, 并且从 HYPERLINK /oktadeveloper/spring-boot-client-credentials-example GitHub中check out。在OAuth 2.0之前,开发人员是利用基于HTTP的认证方式解决端到端认证。本质上来说,就是把用户名密码作为请求的一部分发送给另一个API应用,这个API应用然后会校验每一次请求的用户名密码来判定是否授权。 这样的方式有以下的缺点和暴露点:以上图表中的每一个应用都处理用户名密码二次用户名密码可能要连接到存储用户信息的地方相同的用户名密码在每次

4、请求中都用到有众多不同的方式来减轻这样的风险,但是这超出了这片文章的范围。OAuth 2.0客户端授权的出现,是为了解决基于HTTP的基本授权模式,尽管我们仍然使用用户名和密码(称为client_id和client_secret),通过传输由中间 HYPERLINK /html/rfc6749 l section-1.1 认证服务器产生的token,而不是每次都传输用户名密码。认证服务器返回一个临时性的token(过期时间内有效)。当客户端与资源服务器交互时利用这个token,这意味着最敏感的数据(ID和secret)仅仅在过期时间内才在互联网上共享一次,这极大的降低了损害的可能性。一旦资源服

5、务器收到了带有token的来访请求,它会通过和认证服务器交互来验证这个token。 我会在文章的结尾讨论一些减少网络调用数量的方法,但首先,要介绍一个例子。构建一个OAuth 2.0客户端授权方式应用够了,让我们做点什么吧!我将像你们展示如何实现基于Spring的客户端授权类型的例子,它包括client和server。server端将只包含一个端点返回字符串“message of the day.”。client端将会是一个命令行应用,你可以用后端的Web应用程序,CRON作业或任何其他后端脚本轻松替代它。建立你的认证服务器为了让事情变得更简单,你可以使用Okta作为你的OAuth 2.0 认

6、证服务器。这样将会解决所有以上提到的客户端授权方式所需要的工作。你需要用到Okta吗?一点也不!你可以使用任何你想要的OAuth 2.0的服务器。因为我们所要实现的服务是免费并且易于使用的,这样的方式加快了我们的进度。如果你还没有一个免费的开发者帐号,去/ 申请一个吧,为了完成之后,你需要两个信息:基于Okta的URL,例如Email来激活你的帐号当激活了你的Okta帐号之后,你会处于开发者控制台界面,此时你需要创建一个应用以及一个用户OAuth范围(scope)。Okta将会给你应用一个client_id和secret,然而scope将会限制你的token所能获取到应用的资源。点击Appli

7、cations ,然后依次选择Service - Next ,然后你可以讲名字改成你想要的(我打算改成“My MOD App”),然后,点击Done 。下一步,你将会用到client_id和secret。 然后,为你的应用创建一个 HYPERLINK /oauth2-servers/scope/defining-scopes/ custom scope (权限范围)。从菜单开始,依次选择 API - Authorization Servers 。记住Issuer URI 的值,你需要这个值来完成下一步的操作。通过单击铅笔来编辑认证服务器,然后依次点击Scopes - Add Scope ,将n

8、ame框填为custom_mod,然后点击create 。现在,到有趣的东西了!创建一个资源服务器 HYPERLINK https:/start.spring.io/ 资源服务器(即API服务)将会十分简单,并且只有一个端点 /mod 组成,现在让我们用 Spring Initializer 来创建一个项目吧!curl https:/start.spring.io/starter.tgz -d artifactId=creds-example-server -d dependencies=security,web -d language=java -d type=maven-project -

9、d baseDir=creds-example-server | tar -xzvf -# change into the new directory cd creds-example-server另外,你需要手工的加入以下的依赖到pom.xml中:org.springframework.security.oauth.bootspring-security-oauth2-autoconfigure2.0.0.RELEASENOTE: 从Spring Initializer上面获取的项目,我把名字由 DemoApplication 改为了 ServerApplication , 因为我们将要立刻

10、创建另外一个项目。 下一步,给 ServerApplication 加上 EnableResourceServer 注解。并且实现一个简单的REST控制器。EnableResourceServer SpringBootApplicationpublic class ServerApplication public static void main(String args) SpringApplication.run(ServerApplication.class, args);/* Allows for PreAuthorize annotation processing.*/EnableGl

11、obalMethodSecurity(prePostEnabled = true)protected static class GlobalSecurityConfiguration extends GlobalMethodSecurityConfiguration Overrideprotected MethodSecurityExpressionHandler createExpressionHandler() return new OAuth2MethodSecurityExpressionHandler();RestControllerpublic class MessageOfThe

12、DayController GetMapping(/mod) PreAuthorize(#oauth2.hasScope(custom_mod)public String getMessageOfTheDay(Principal principal) return The message of the day is boring for user: + principal.getName();现在,该配置文件了!我把pertis改为了application.yml 。并且做了如下更新:security: oauth2:client:clientId: client-id-from-above

13、clientSecret: client-secret-from-aboveresource:tokenInfoUri: issuer-uri-from-above/v1/introspect就是这样,只需要几行代码的配置,Spring Boot自动的完成对token的校验,你所需要做的就是专注于你的代码。下一步,启动并运行它。 你可以访问http:/localhost:8080/mod 。但是它会返回401UNAUTHORIZED创建OAuth 2.0客户端下一步,将创建一个简单的命令行应用,你能够轻易的在任何应用中使用它。 现在,打开一个命令终端,并利用Spring Initializer

14、 创建第二个应用:curl https:/start.spring.io/starter.tgz -d artifactId=creds-example-client -d dependencies=security -d language=java -d type=maven-project -d baseDir=creds-example-client | tar -xzvf -# change into the new directory cd creds-example-client然后,和之前一样,往pom文件里面加入Spring OAuth 2.0 依赖:org.springfra

15、mework.security.oauth.bootspring-security-oauth2-autoconfigure2.0.0.RELEASE此时,在如下配置文件下,我启动了应用(我同样把 perties 改为了 application.yml ):example:baseUrl: http:/localhost:8080 oauth2:client:grantType: client_credentials clientId: client-id-from-aboveclientSecret: client-secret-from-above accessTokenUri: issu

16、er-uri-from-above/v1/token scope: custom_mod我设置配置文件的命名空间为 example ,因为你可能会去连接不同的服务端。 我同时还定义了以下的属性: baseUrl :我们示例服务端的主页 grantType :连接通信的授权模式 clientId 和 clientSecret :和上面授权服务器一致的账号密码 accessTokenUri :定义用来获取授权的URI scope :我们在上面创建的用户权限范围最后是我们的 ClientApplication (原先为 DemoApplication ,更改为 ClientApplication )

17、SpringBootApplicationpublic class ClientApplication implements CommandLineRunner private final Logger logger = LoggerFactory.getLogger(ClientApplication.class); Value(# environmentexample.baseUrl )private String serverBaseUrl;public static void main(String args) SpringApplication.run(ClientApplicati

18、on.class, args);Bean ConfigurationProperties(example.oauth2.client)protected ClientCredentialsResourceDetails oAuthDetails() return new ClientCredentialsResourceDetails();Beanprotected RestTemplate restTemplate() return new OAuth2RestTemplate(oAuthDetails();Overridepublic void run(String. args) (MOD

19、: , restTemplate().getForObject(serverBaseUrl + /mod, String.class);以上代码我有以下几点说明以下: CommandLineRunner 接口提供了一个 run 方法,当初始化后,它将自动执行,执行完这个方法,应用程序退出。我创建了一个 ClientCredentialsResourceDetails 的bean,它绑定了我的配置文件中的前缀: example.oauth2.client我使用OAuth2RestTemplate替代标准的RestTemplate。它将自动管理所有的OAuth2.0的token交换,并设置身份认证:设置请求头的值。总的来说,它处理了所有的OAuth认证的细节,所以你不用担心里面任意一点。下一步,执行以下命令 ./mvnw spring-boot:run 启动这个应用,你应该可以看到相似的一条输出:2018-03-20 12:56:10.058 INFO 15833 main c.e.c.ClientApplication: MOD: T

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论