SpringSecurity:通过OAuth2集成Github

本文介绍如何使用Spring Security与OAuth2.0实现单点登录(SSO),特别聚焦于集成GitHub作为身份提供商的过程。包括在GitHub上注册客户端应用、配置SSL证书、IDEA环境搭建以及验证流程。

nuts-and-bolts-of-oauth

1. 背景

近期由于新建的项目,因为涉及到前后端分离以及单点登录,综合考虑,决定采用 SpringSecurity + Oauth2.0 ,我也正好趁此机会学习下此类知识,回想起最近一次学习安全框架还是 Shiro。 SSO 基础就不说了,敢兴趣的可以自行百度或者谷歌。

因为 SpringSecurity 本身提供了 GOOGLE GITHUB FACEBOOK OKTAOAuth2.0 接入支持,具体源码都在枚举类CommonOAuth2Provider 中。


public enum CommonOAuth2Provider {
    GOOGLE {
        public ClientRegistration.Builder getBuilder(String registrationId) {
            ClientRegistration.Builder builder = this.getBuilder(registrationId, ClientAuthenticationMethod.CLIENT_SECRET_BASIC, "{baseUrl}/{action}/oauth2/code/{registrationId}");
            builder.scope(new String[]{"openid", "profile", "email"});
            builder.authorizationUri("https://accounts.google.com/o/oauth2/v2/auth");
            builder.tokenUri("https://www.googleapis.com/oauth2/v4/token");
            builder.jwkSetUri("https://www.googleapis.com/oauth2/v3/certs");
            builder.issuerUri("https://accounts.google.com");
            builder.userInfoUri("https://www.googleapis.com/oauth2/v3/userinfo");
            builder.userNameAttributeName("sub");
            builder.clientName("Google");
            return builder;
        }
    },
    GITHUB {
        public ClientRegistration.Builder getBuilder(String registrationId) {
            ClientRegistration.Builder builder = this.getBuilder(registrationId, ClientAuthenticationMethod.CLIENT_SECRET_BASIC, "{baseUrl}/{action}/oauth2/code/{registrationId}");
            builder.scope(new String[]{"read:user"});
            builder.authorizationUri("https://github.com/login/oauth/authorize");
            builder.tokenUri("https://github.com/login/oauth/access_token");
            builder.userInfoUri("https://api.github.com/user");
            builder.userNameAttributeName("id");
            builder.clientName("GitHub");
            return builder;
        }
    },
    FACEBOOK {
        public ClientRegistration.Builder getBuilder(String registrationId) {
            ClientRegistration.Builder builder = this.getBuilder(registrationId, ClientAuthenticationMethod.CLIENT_SECRET_POST, "{baseUrl}/{action}/oauth2/code/{registrationId}");
            builder.scope(new String[]{"public_profile", "email"});
            builder.authorizationUri("https://www.facebook.com/v2.8/dialog/oauth");
            builder.tokenUri("https://graph.facebook.com/v2.8/oauth/access_token");
            builder.userInfoUri("https://graph.facebook.com/me?fields=id,name,email");
            builder.userNameAttributeName("id");
            builder.clientName("Facebook");
            return builder;
        }
    },
    OKTA {
        public ClientRegistration.Builder getBuilder(String registrationId) {
            ClientRegistration.Builder builder = this.getBuilder(registrationId, ClientAuthenticationMethod.CLIENT_SECRET_BASIC, "{baseUrl}/{action}/oauth2/code/{registrationId}");
            builder.scope(new String[]{"openid", "profile", "email"});
            builder.userNameAttributeName("sub");
            builder.clientName("Okta");
            return builder;
        }
    };

这里仅对 Github 单点登录作为样例,作此说明,都是在 Windows 中的开发环境。

2. Client注册登记

  • 注册:在 Github 中注册一个 Client 应用,界面生成 client-idclient-secret

注册地址:https://github.com/settings/applications/new

20220813220500

  • Homepage URL:首页 https://localhost:9006
  • Authorization callback URL:授权回调地址 https://localhost:9006/login/oauth2/code/github

注册,比较简单,自行。

3. SSL证书

演示环境下必须是 HTTPS 类型,否则会不成功。详细配置参考[[Java生成SSL证书]]

如果不安装证书,会有如下情况。

20220813232536

4. IDEA配置

4.1. pom


<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-client</artifactId>
    </dependency>
</dependencies>

4.2. yml


server:
  ssl:
    key-store: https.keystore
    key-store-password: 123456
    key-alias: tomcat
  port: 9006
spring:
  security:
    oauth2:
      client:
        registration:
          github:
            #对应Github账号配置的Client ID
            client-id: 08bc4fb36fxx580a57c1
            #对应Github账号配置的Client secrets
            client-secret: df677b978decxefab1c95d4e28288b86913c323

5. 验证Github信息

输入 Github 的账号、密码,会进入我们之前配置的 Home

登录Github

5.1. Home主页

20220813231139

5.2. 查看注册信息

20220814003106

5.3. 查看Token

20220814003127

5.4. 查看用户信息

20220814003203

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王老邪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值