SpringBoot整合SpringSecurity+Oauth2实现Google登录

文章目录

  • 一:OAuth2
    • 1.1 什么是OAuth2
    • 1.2 OAuth2协议特点
    • 1.3 为什么用OAuth2
    • 1.4 认证流程图
    • 1.5 OAuth2 四种认证模式的流程
      • 1.5.1 Authorization Code (授权码模式)
        • 1.5.1.1 应用场景
        • 1.5.1.2 流程图
        • 1.5.1.3 操作步骤
      • 1.5.2 Resource Owner Password Credentials Grant(密码模式)
        • 1.5.2.1 应用场景
        • 1.5.2.2 流程图
        • 1.5.2.3 认证步骤
      • 1.5.3 Implicit Grant (隐式授权模式)
        • 1.5.3.1 应用场景
        • 1.5.3.2 流程图
        • 1.5.3.3 认证步骤
      • 1.5.4 Client Credentials Grant (客户端凭证模式)
        • 1.5.4.1 应用场景
        • 1.5.4.2 流程
        • 1.5.4.3 认证步骤
  • 二:访问Google API,申请client-id和client-secret
    • 2.1
    • 2.2 谷歌API访问地址
    • 2.3 申请client-id和client-secret
    • 2.4 配置OAuth consent screen
      • 2.4.1 点击OAuth consent screen
      • 2.4.2 添加测试用户
  • 三:SpringBoot整合SpringSecurity框架
    • 3.1 引入依赖
    • 3.2 配置谷歌登录的application.yml文件
    • 3.3 编写SpringSecurity的配置类
    • 3.4 编写TokenAuthFilter的配置类
    • 3.5 编写生成token的工具类
  • 四:接口调用规则
    • 4.1 通过code获取access_token
    • 4.2 通过access_token获取userInfo
  • 五:SpringSecurity整合OAuth2+Google登录
    • 5.1 实现页面跳转
    • 5.2 通过code获取access_token和谷歌认证用户信息
      • 5.2.1 controller层代码开发
      • 5.2.2 service层代码开发
      • 5.2.3 GoogleUser
      • 5.2.4 GoogleCodeRespVo
      • 5.2.5 GoogleTokenRespVo
  • 六: 设置代理
    • 6.1 查看代理的ip和端口
    • 6.2 配置restTemplate,设置代理

一:OAuth2

1.1 什么是OAuth2

OAuth2.0介绍 OAuth(Open Authorization)是一个关于授权的开放网络标准,允许用户授权第三方 应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他 们数据的所有内容。OAuth在全世界得到广泛应用,目前的版本是2.0版。

1.2 OAuth2协议特点

  • 简单:不管是OAuth服务提供者还是应用开发者,都很易于理解与使用;
  • 安全:没有涉及到用户密钥等信息,更安全更灵活;
  • 开放:任何服务提供商都可以实现OAuth,任何软件开发商都可以使用OAuth;

1.3 为什么用OAuth2

接入第三方应用授权登录,比如QQ,微博,微信,谷歌的授权登录。

1.4 认证流程图

SpringBoot整合SpringSecurity+Oauth2实现Google登录_第1张图片

1.5 OAuth2 四种认证模式的流程

1.5.1 Authorization Code (授权码模式)

1.5.1.1 应用场景

这种方式是最常用的流程,安全性也最高,它适用于那些有后端的 Web 应用。授权码通过前端传送,令牌则是储存在后端,而且所有与资源服务器的通信都在后端完成。这样的前后端分离,可以避免令牌泄漏。

1.5.1.2 流程图

SpringBoot整合SpringSecurity+Oauth2实现Google登录_第2张图片

1.5.1.3 操作步骤

  1. 用户在客户端程序上操作某些功能希望从资源服务器获取数据
  2. 客户端程序重定向浏览器请求到授权服务器要求授权,在重定向之前客户端程序会给授权服务器传递一个参数作为回调地址
  3. 授权服务器请求用户同意,这个步骤一般需要用户先登录,如果已经登录则可能弹出一个交互页面请求用户同意授权
  4. 用户决定同意授权
  5. 授权服务器重定向到第二步的回调地址,并且在URL 后附带一个Authorization Code,这个Authorization Code 是明文传递给客户端程序的,所以不安全
  6. 客户端程序用 Authorization Code 和 认证的密钥获取 access token
  7. 客户端程序用access token 访问资源服务器(也就是实际的业务接口)
  8. 资源服务器返回数据给客户端程序

1.5.2 Resource Owner Password Credentials Grant(密码模式)

1.5.2.1 应用场景

如果你高度信任某个应用,RFC 6749 也允许用户把用户名和密码,直接告诉该应用。该应用就使用你的密码,申请令牌,这种方式称为"密码式(password)

1.5.2.2 流程图

SpringBoot整合SpringSecurity+Oauth2实现Google登录_第3张图片

1.5.2.3 认证步骤

  1. 用户访问用页面时,输入第三方认证所需要的信息(QQ/微信账号密码)
  2. 应用页面那种这个信息去认证服务器授权
  3. 认证服务器授权通过,拿到token,访问真正的资源页面

1.5.3 Implicit Grant (隐式授权模式)

1.5.3.1 应用场景

有些 Web 应用是纯前端应用,没有后端。这时就不能用上面的方式了,必须将令牌储存在前端。RFC 6749 就规定了第二种方式,允许直接向前端颁发令牌。这种方式没有授权码这个中间步骤,所以称为(授权码)“隐藏式”(implicit)

1.5.3.2 流程图

SpringBoot整合SpringSecurity+Oauth2实现Google登录_第4张图片

1.5.3.3 认证步骤

  1. 用户访问页面时,重定向到认证服务器。
  2. 认证服务器给用户一个认证页面,等待用户授权。
  3. 用户授权,认证服务器想应用页面返回Token
  4. 验证Token,访问真正的资源页面

1.5.4 Client Credentials Grant (客户端凭证模式)

1.5.4.1 应用场景

适用于没有前端的命令行应用,即在命令行下请求令牌

1.5.4.2 流程

SpringBoot整合SpringSecurity+Oauth2实现Google登录_第5张图片

1.5.4.3 认证步骤

  1. 用户访问应用客户端
  2. 通过客户端定义的验证方法,拿到token,无需授权
  3. 访问资源服务器A
  4. 拿到一次token就可以畅通无阻的访问其他的资源页面

二:访问Google API,申请client-id和client-secret

2.1

想要访问GoogleApi,需要进行操作,具体如何,此处不做过多介绍。

2.2 谷歌API访问地址

https://console.cloud.google.com/apis/dashboard?project=keen-jigsaw-263908&angularJsUrl=

2.3 申请client-id和client-secret

SpringBoot整合SpringSecurity+Oauth2实现Google登录_第6张图片
SpringBoot整合SpringSecurity+Oauth2实现Google登录_第7张图片
SpringBoot整合SpringSecurity+Oauth2实现Google登录_第8张图片
SpringBoot整合SpringSecurity+Oauth2实现Google登录_第9张图片

注:

  1. 已获授权的重定向 URI是谷歌调用成功后,会回调的接口,这里开发人员自定义编写即可。
  2. 此时写localhost,不要填127.0.0.1,否则谷歌无法调用到你的回调接口。

SpringBoot整合SpringSecurity+Oauth2实现Google登录_第10张图片
此时client-id和client-secret就申请好了

2.4 配置OAuth consent screen

2.4.1 点击OAuth consent screen

SpringBoot整合SpringSecurity+Oauth2实现Google登录_第11张图片

2.4.2 添加测试用户

SpringBoot整合SpringSecurity+Oauth2实现Google登录_第12张图片
SpringBoot整合SpringSecurity+Oauth2实现Google登录_第13张图片

三:SpringBoot整合SpringSecurity框架

3.1 引入依赖

        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-oauth2-clientartifactId>
        dependency>

        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-securityartifactId>
        dependency>

3.2 配置谷歌登录的application.yml文件

spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: 796432711705-r3p9ffmht6s0tnd7ghuqub5vi9t9q194.apps.googleusercontent.com
            client-secret: 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
            redirect-uri: http://localhost:8989/googleLoginCallback

注:

  1. client-id和client-secret就是刚才申请的key和秘钥
  2. redirect-uri就是刚才的填写的登录成功回调地址,必须保持一致,否则会报错

3.3 编写SpringSecurity的配置类

@Configuration
@EnableWebSecurity
public class WebAuthConfig extends WebSecurityConfigurerAdapter {
   

    @Autowired
    private SysMenuService sysMenuService;

    @Autowired
    private GoogleMapper googleMapper;

    /**
     * 配置谷歌的登录界面
     * @param http
     * @throws Exception
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
   
        //授权认证
        http
                //关闭csrf
                .csrf().disable()
                // 开启跨域以便前端调用接口
                .cors().and()
                .authorizeRequests()
                ///googleLogin不需要被认证,可以被放行
                .antMatchers("/googleLoginCallback","/getTokenByCode").permitAll()
                //所有请求必须认证,必须登录后才能访问
                .anyRequest()
                .authenticated().and()
                //TokenAuthenticationFilter放到UsernamePasswordAuthenticationFilter的前面,这样做就是为了除了登录的时候去查询数据库外,其他时候都用token进行认证。
                .addFilterAfter(new TokenAuthFilter(), UsernamePasswordAuthenticationFilter.class)
                .oauth2Login(
                        oauth2Customize -> oauth2Customize
                                //跳转到谷歌登录界面
                                .loginPage("/oauth2/authorization/google")
                                .successHandler((request, response, authentication) -> {
   
                                    request.authenticate(response);
                                })
                                .failureHandler((request, response, authentication) -> {
   
                                    request.authenticate(response);
                                })
                );
    }

注:

  1. addFilterAfter为了授权通过前,验证token的合法性。
  2. loginPage的路径就是需要跳转认证的界面。

3.4 编写TokenAuthFilter的配置类

/**
 * 认证解析token过滤器
 * OncePerRequestFilter可以保证一次外部请求,只执行一次过滤方法,对于服务器内部之间的forward等请求,不会再次执行过滤方法。
 */
public class TokenAuthFilter extends OncePerRequestFilter {
   

    public TokenAuthFilter(){
   

你可能感兴趣的:(spring,boot,后端,java)