1.OAuth 2.0 Login

OAuth 2.0登录功能为应用程序提供了使用OAuth 2.0提供程序(例如GitHub)或OpenID Connect 1.0提供程序(例如Google)上的现有帐户登录应用程序的功能。 OAuth 2.0 Login实现了用例:“使用Google登录”或“使用GitHub登录”。

OAuth 2.0登录是使用授权代码授予实现的,如OAuth
2.0授权框架和OpenID Connect Core 1.0中所指定。

1.1 Spring Boot 2.x Sample

Spring Boot 2.x为OAuth 2.0登录带来了完整的自动配置功能。

本部分介绍如何使用Google作为身份验证提供程序配置OAuth 2.0登录示例,并介绍以下主题:

  • 1.1.1 初始化安装
  • 1.1.2 设置重定向 URI
  • 1.1.3 配置 application.yml
  • 1.1.4 启动 application

1.1.1 初始化安装

要使用Google的OAuth 2.0身份验证系统进行登录,您必须在Google API控制台中设置项目以获取OAuth 2.0凭据。

Google的OAuth 2.0身份验证实现符合OpenID
Connect1.0规范,并通过OpenID认证

按照OpenID Connect页面上的说明操作,从“设置OAuth 2.0”部分开始。

完成“获取OAuth 2.0凭据”说明后,您应该拥有一个新的OAuth客户端,其凭据包含客户端ID和客户端密钥。

1.1.2 设置重定向 URI

重定向URI是应用程序中的路径,最终用户的用户代理在通过Google进行身份验证并在“同意”页面上授予了对OAuth客户端(在上一步中创建)的访问权限后重定向回的路径。

在“设置重定向URI”子部分中,确保将“授权重定向URI”字段设置为

http://localhost:8080/login/oauth2/code/google

默认重定向URI模板是{baseUrl}/login/oauth2/code/{registrationId}。
registrationId是ClientRegistration的唯一标识符。

1.1.3 配置 application.yml

既然您有一个新的OAuth客户端与Google,您需要配置应用程序以使用OAuth客户端进行身份验证流程

1.转到application.yml并设置以下配置

spring:security:oauth2:client:registration:   1google:   2client-id: google-client-idclient-secret: google-client-secret

Example 6.1. OAuth Client properties

例6.1 OAuth客户端属性

  • 1 spring.security.oauth2.client.registration是OAuth客户端属性的基本属性前缀。
  • 2 基本属性前缀后面是ClientRegistration的ID,例如google。

1.1.4 启动application

启动Spring Boot 2.x示例并转到http://localhost:8080 然后,您将被重定向到默认的自动生成的登录页面,该页面显示Google的链接。

点击Google链接,然后您将重定向到Google进行身份验证。

使用您的Google帐户凭据进行身份验证后,显示给您的下一页是“同意”屏幕。 “同意”屏幕会要求您允许或拒绝访问您之前创建的OAuth客户端。 单击“允许”以授权OAuth客户端访问您的电子邮件地址和基本配置文件信息。

此时,OAuth客户端从UserInfo端点检索您的电子邮件地址和基本配置文件信息,并建立经过身份验证的会话。

1.2 Spring Boot 2.x Property Mappings

下表概述了Spring Boot 2.x OAuth客户端属性到ClientRegistration属性的映射:

Spring Boot 2.x ClientRegistration
spring.security.oauth2.client.registration.[registrationId] registrationId
spring.security.oauth2.client.registration.[registrationId].client-id clientId
spring.security.oauth2.client.registration.[registrationId].client-secret clientSecret
spring.security.oauth2.client.registration.[registrationId].client-authentication-method clientAuthenticationMethod
spring.security.oauth2.client.registration.[registrationId].authorization-grant-type authorizationGrantType
spring.security.oauth2.client.registration.[registrationId].redirect-uri redirectUriTemplate
spring.security.oauth2.client.registration.[registrationId].scope scopes
spring.security.oauth2.client.registration.[registrationId].client-name clientName
spring.security.oauth2.client.provider.[providerId].authorization-uri providerDetails.authorizationUri
spring.security.oauth2.client.provider.[providerId].token-uri providerDetails.tokenUri
spring.security.oauth2.client.provider.[providerId].jwk-set-uri providerDetails.jwkSetUri
spring.security.oauth2.client.provider.[providerId].user-info-uri providerDetails.userInfoEndpoint.uri
spring.security.oauth2.client.provider.[providerId].user-info-authentication-method providerDetails.userInfoEndpoint.authenticationMethod
spring.security.oauth2.client.provider.[providerId].userNameAttribute providerDetails.userInfoEndpoint.userNameAttributeName

1.3 CommonOAuth2Provider

CommonOAuth2Provider为众多知名提供商预定义了一组默认客户端属性:Google,GitHub,Facebook和Okta。

例如,authorization-uri,token-uri和user-info-uri对于Provider不会经常更改。 因此,提供默认值以减少所需配置是有意义的。

如前所述,当我们配置Google客户端时,只需要client-id和client-secret属性。

以下清单显示了一个示例:

spring:security:oauth2:client:registration:google:client-id: google-client-idclient-secret: google-client-secret

客户端属性的自动默认无缝地在这里工作,因为registrationId(google)与CommonOAuth2Provider中的GOOGLE枚举(不区分大小写)匹配。

对于您可能希望指定其他registrationId(例如google-login)的情况,您仍然可以通过配置provider属性来利用客户端属性的自动默认。

以下清单显示了一个示例:

spring:security:oauth2:client:registration:google-login: 1provider: google    2client-id: google-client-idclient-secret: google-client-secret
  • 1registrationId设置为google-login。
  • 2provider属性设置为google,它将利用CommonOAuth2Provider.GOOGLE.getBuilder()中设置的客户端属性的自动默认。

1.4 Configuring Custom Provider Properties

有些OAuth 2.0提供程序支持多租户,这会导致每个租户(或子域)使用不同的协议端点。

例如,向Okta注册的OAuth客户端被分配给特定的子域并拥有自己的协议端点。

对于这些情况,Spring Boot 2.x提供了以下用于配置自定义提供程序属性的基本属性:

spring.security.oauth2.client.provider.[providerId]

以下清单显示了一个示例:

spring:security:oauth2:client:registration:okta:client-id: okta-client-idclient-secret: okta-client-secretprovider:okta: 1authorization-uri: https://your-subdomain.oktapreview.com/oauth2/v1/authorizetoken-uri: https://your-subdomain.oktapreview.com/oauth2/v1/tokenuser-info-uri: https://your-subdomain.oktapreview.com/oauth2/v1/userinfouser-name-attribute: subjwk-set-uri: https://your-subdomain.oktapreview.com/oauth2/v1/keys
  • 1基本属性(spring.security.oauth2.client.provider.okta)允许自定义配置协议端点位置。

1.5 Overriding Spring Boot 2.x Auto-configuration

OAuth客户端支持的Spring Boot 2.x自动配置类是OAuth2ClientAutoConfiguration。

它执行以下任务:

从配置的OAuth客户端属性注册由ClientRegistration组成的ClientRegistrationRepository @Bean。
提供WebSecurityConfigurerAdapter @Configuration并通过httpSecurity.oauth2Login()启用OAuth 2.0登录。
如果您需要根据具体要求覆盖自动配置,可以通过以下方式执行此操作:

  • 注册ClientRegistrationRepository @Bean
  • 提供WebSecurityConfigurerAdapter
  • 完全覆盖自动配置

注册ClientRegistrationRepository @Bean

以下示例显示如何注册ClientRegistrationRepository @Bean:

@Configuration
public class OAuth2LoginConfig {@Beanpublic ClientRegistrationRepository clientRegistrationRepository() {return new InMemoryClientRegistrationRepository(this.googleClientRegistration());}private ClientRegistration googleClientRegistration() {return ClientRegistration.withRegistrationId("google").clientId("google-client-id").clientSecret("google-client-secret").clientAuthenticationMethod(ClientAuthenticationMethod.BASIC).authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE).redirectUriTemplate("{baseUrl}/login/oauth2/code/{registrationId}").scope("openid", "profile", "email", "address", "phone").authorizationUri("https://accounts.google.com/o/oauth2/v2/auth").tokenUri("https://www.googleapis.com/oauth2/v4/token").userInfoUri("https://www.googleapis.com/oauth2/v3/userinfo").userNameAttributeName(IdTokenClaimNames.SUB).jwkSetUri("https://www.googleapis.com/oauth2/v3/certs").clientName("Google").build();}
}

提供WebSecurityConfigurerAdapter

以下示例说明如何使用@EnableWebSecurity提供WebSecurityConfigurerAdapter并通过httpSecurity.oauth2Login()启用OAuth 2.0登录:

@EnableWebSecurity
public class OAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated().and().oauth2Login();}
}

完全覆盖自动配置

以下示例说明如何通过注册ClientRegistrationRepository @Bean并提供WebSecurityConfigurerAdapter来完全覆盖自动配置。

@Configuration
public class OAuth2LoginConfig {@EnableWebSecuritypublic static class OAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated().and().oauth2Login();}}@Beanpublic ClientRegistrationRepository clientRegistrationRepository() {return new InMemoryClientRegistrationRepository(this.googleClientRegistration());}private ClientRegistration googleClientRegistration() {return ClientRegistration.withRegistrationId("google").clientId("google-client-id").clientSecret("google-client-secret").clientAuthenticationMethod(ClientAuthenticationMethod.BASIC).authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE).redirectUriTemplate("{baseUrl}/login/oauth2/code/{registrationId}").scope("openid", "profile", "email", "address", "phone").authorizationUri("https://accounts.google.com/o/oauth2/v2/auth").tokenUri("https://www.googleapis.com/oauth2/v4/token").userInfoUri("https://www.googleapis.com/oauth2/v3/userinfo").userNameAttributeName(IdTokenClaimNames.SUB).jwkSetUri("https://www.googleapis.com/oauth2/v3/certs").clientName("Google").build();}
}

1.6 Java Configuration without Spring Boot 2.x

如果您无法使用Spring Boot 2.x并且想要在CommonOAuth2Provider中配置一个预定义的提供程序(例如,Google),请应用以下配置:

@Configuration
public class OAuth2LoginConfig {@EnableWebSecuritypublic static class OAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated().and().oauth2Login();}}@Beanpublic ClientRegistrationRepository clientRegistrationRepository() {return new InMemoryClientRegistrationRepository(this.googleClientRegistration());}@Beanpublic OAuth2AuthorizedClientService authorizedClientService(ClientRegistrationRepository clientRegistrationRepository) {return new InMemoryOAuth2AuthorizedClientService(clientRegistrationRepository);}@Beanpublic OAuth2AuthorizedClientRepository authorizedClientRepository(OAuth2AuthorizedClientService authorizedClientService) {return new AuthenticatedPrincipalOAuth2AuthorizedClientRepository(authorizedClientService);}private ClientRegistration googleClientRegistration() {return CommonOAuth2Provider.GOOGLE.getBuilder("google").clientId("google-client-id").clientSecret("google-client-secret").build();}
}

1.7 Additional Resources

以下附加资源描述了高级配置选项:

  • OAuth 2.0登录页面
  • 重定向端点
  • UserInfo端点:
    • 映射用户权限
    • 配置自定义OAuth2User
    • OAuth 2.0 UserService
    • OpenID Connect 1.0 UserService

8. Spring Security 5.1之 OAuth 2.0 Login相关推荐

  1. Spring Security系列(11)- Security5.0版本Oauth2开放平台环境搭建

    前言 上篇文档,我们了解了OAuth2.0的相关知识,接下来我们搭建一个自己的Oauth2开放平台. 从流程图中,可以看到,后台需要搭建一个认证服务器,负责用户登录.第三方授权等功能,还需要搭建自己的 ...

  2. java hipster!_通过Java Hipster升级Spring Security OAuth和JUnit测试

    java hipster! "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权 ...

  3. 通过Java Hipster升级Spring Security OAuth和JUnit测试

    "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. 使用单元 ...

  4. oidc auth2.0_使用Spring Security 5.0和OIDC轻松构建身份验证

    oidc auth2.0 "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和 ...

  5. 使用Spring Security 5.0和OIDC轻松构建身份验证

    "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. Spri ...

  6. java oauth2登录以及权限_Spring Cloud集成Security OAuth 2.0权限鉴权验证示例

    Spring Cloud集成Security OAuth 2.0权限鉴权验证示例 一.背景说明 目前市场上微服务之间涉及到相互调用的问题,在这个过程中为了验证安全性,需要采用鉴权方式进行管理.目前主流 ...

  7. Spring Security——OAuth 2.0登录——Google,GitHub,Facebook和Okta

    基本概念 OAuth 2.0登录:OAuth 2.0登录功能为应用程序提供了使用户能够通过使用其在OAuth 2.0提供程序(例如GitHub)或OpenID Connect 1.0提供程序(例如Go ...

  8. Spring Boot OAuth 2.0 客户端

    在上一篇<OAuth 2.0 授权码请求>中我们已经可以获取到access_token了,本节将使用客户端来访问远程资源 配置资源服务器 授权服务器负责生成并发放访问令牌(access_t ...

  9. Spring Security Java Config Preview--官方

    原文地址:[1]https://spring.io/blog/2013/07/02/spring-security-java-config-preview-introduction/ [2]https ...

最新文章

  1. MOS管电源开关电路的软启动
  2. PL/SQL高级编程
  3. 云上快报 | 分布式架构引领核心系统架构转型新趋势
  4. oracle locked time,ORACLE distributed_lock_timeout参数
  5. 计算机在生物学研究领域的认识,阮晓钢——北京工业大学——主要研究领域涉及:控制科学与工程,人工智能与认知科学,机器人学与机器人技术,计算机应用技术,生物医学工程与生物信息学。...
  6. python的集成开发环境搭建_Window版本 - Python数据分析集成开发环境 Anaconda安装(超详细)...
  7. 微软重拳出击:盗版 Windows 将无处遁形!
  8. 微信快速开发框架(五)-- 利用快速开发框架,快速搭建微信浏览博客园首页文章...
  9. [leetcode]376. 摆动序列
  10. 32位电脑适合装W ndows10,32位再见?微软将停止支持32位Win10系统
  11. 手工打造迅雷9超精简版
  12. 【笔记】人工智能 一种现代方法 人工智能 一种现代方法 第5章 对抗搜索
  13. R语言可视化——熵曲线
  14. Qt使用qwtplot3d绘制3D曲面
  15. java sci论文,SCI论文中那些容易被混淆的部分!你写错过吗?
  16. java程序员那些提升_Java程序员如何进行自我提升?
  17. 华为智慧屏和鸿蒙系统对比,华为s55和v55i对比_华为智慧屏s55和v55i哪个好
  18. 动漫学日语《灌篮高手》(更新中)
  19. Python丨Django实现微电影网站
  20. 名词解释:Web3 账户相关概念大梳理

热门文章

  1. HTML5 Canvas编写五彩连珠(5):寻路
  2. iOS—网络实用技术OC篇网络爬虫-使用java语言抓取网络数据
  3. 笔记本插入麦克风被识别成耳机怎么办
  4. 伯德图 matlab,matlab画三维伯德图,bode图
  5. java 金额千位用逗号隔开_金额格式化 处理千分位 金额逗号,隔开
  6. 第4节 操作器和Trackball
  7. 卷积神经网络实例Python(VGG)
  8. Ios开发-第一天-Tom猫
  9. 基于51单片机设计的交通灯
  10. 数据库连接的Persist Security Info参数说明