¶ Spring Boot Web App 快速开始
本教程讲述在 Spring Boot 框架下处理用户登录、检查登录状态、获取用户信息、登出的方式。
环境要求:Spring Boot 2.4+
¶ 配置 Authing
¶ 创建应用
你需要先在 Authing 创建一个应用。进入控制台 (opens new window) > 应用,点击右上角的「创建自建应用」。
应用名称可以随意填写。
认证地址需填入自定义的域名,但不可与 Authing 数据库中的重复。填写后,会拼接成一段 URL 作为这个应用在 Authing 的唯一标识。
应用类型可以随意选择,此处以最常用的「标准 Web 应用」为例。
¶ 配置应用
在应用列表找到你的应用,单击进入应用详情。在应用详情页面上方的导航栏中单击「应用配置」,进入配置界面。
向下滑动找到「认证配置」卡片,在登录回调 URL栏填入 http://localhost:8080/callback
。当用户在 Authing 完成认证后,Authing 会将用户重定向到该回调地址。
配置完成后,不要忘记单击对应的「保存」按钮保存你的设置。
¶ 建立 Spring Boot 项目
¶ 在线创建项目
访问 Spring Initializr (opens new window) ,参考图中配置创建 Spring Boot 项目:
¶ 本地创建项目
本地打开 IDEA,参考图中配置创建 Spring Boot 项目:
为简洁起见,上述两种方法只添加了基础的 Spring Web 依赖项,其它依赖项可按需添加。
Java 语言版本也可以按需选择,示例代码中使用版本 8。
¶ 集成 Authing SDK
打开项目根目录的 pom.xml 文件,在 dependencies 标签下加入如下依赖项:
<dependency> <groupId>cn.authing</groupId> <artifactId>authing-java-sdk</artifactId> <version>{{LATEST_VERSION}}</version> </dependency>
复制成功
其中最新的版本号 LATEST_VERSION 可在 Maven 仓库 (opens new window) 找到。
在 properties 标签下加入如下配置项:
由于 spring 依赖的 OkHttp 版本过低,所以你需要手动指定一下 OkHttp 的版本。
<properties> <okhttp3.version>4.8.0</okhttp3.version> </properties>
复制成功
保存文件,大多数 IDE 会自动从 Maven 仓库拉取依赖项。也可以在项目根目录执行以下命令来手动获取依赖项:
mvn dependency:resolve
复制成功
¶ 初始化 AuthenticationClient
Authing Java SDK 在 AuthenticationClient 类中封装了和用户登录相关的方法,这里我们将其作为一个 Bean 存放到 Spring 容器中。
创建一个配置类,或者在你的 Main Class(示例中是 AuthingJavaDemoApplication)中添加如下方法:
@Configuration public class AuthingConfig { @Bean @Scope("prototype") public AuthenticationClient authenticationClient() throws IOException, ParseException { //在构造函数中分别填入自己的 App ID、App Secret、APP Host。 AuthenticationClientOptions options = new AuthenticationClientOptions(); options.setAppId("YOUR_APP_ID"); options.setAppSecret("YOUR_APP_SECRET"); options.setAppHost("YOUR_APP_HOST"); AuthenticationClient client = new AuthenticationClient(options); return client; } }
复制成功
AuthenticationClient 类要求每次调用初始化新实例,因此要将其作用域设为 prototype。关于如何获取App ID、App Secret 和 APP Host,请参考 如何获取 App ID 和 App Secret 。
¶ 编写控制器
¶ 添加控制器
在项目主启动类同级目录内添加一个控制器,并注入相关依赖:
package cn.authing.javaexpressdemo.controller; // import 语句请自行添加 @Controller public class DemoController { public static final String KEY_ACCESS_TOKEN = "access_token"; public static final String KEY_ID_TOKEN = "id_token"; public static final String KEY_REFRESH_TOKEN = "refresh_token"; private final HttpSession session; private final ObjectFactory<AuthenticationClient> authClientFactory; public DemoController(HttpSession session, ObjectFactory<AuthenticationClient> authClientFactory) { this.session = session; this.authClientFactory = authClientFactory; } // 在这里添加路由方法…… }
复制成功
¶ 添加认证能力
为了给应用添加认证能力,需要监听三个路由:登录、回调、登出。
¶ 发起登录
监听 /login 端点,当你访问 http://localhost:8080/login 时,你会被重定向到 Authing 完成认证。
@GetMapping("/login") public String login() { BuildAuthUrlParams params = new BuildAuthUrlParams(); String redirectUri = authClientFactory.getObject().getOptions().getRedirectUri(); params.setRedirectUri(redirectUri); return "redirect:" + authClientFactory.getObject().buildAuthUrl(params).getUrl(); }
复制成功
¶ 处理回调
监听 /callback 端点,当你在 Authing 完成认证后,Authing 会将你重定向到回调地址。在回调地址可以获取用户信息并存放在 session 中,随后将你重定向到应用的其他页面。
@GetMapping("/callback") @SuppressWarnings("unchecked") public String callback(@RequestParam String code) throws Exception { OIDCTokenResponse oidcTokenResponse = authClientFactory.getObject().getAccessTokenByCode(code); session.setAttribute(KEY_ACCESS_TOKEN, oidcTokenResponse.getAccessToken()); session.setAttribute(KEY_ID_TOKEN, oidcTokenResponse.getIdToken()); session.setAttribute(KEY_REFRESH_TOKEN, oidcTokenResponse.getRefreshToken()); return "redirect:/profile"; }
复制成功
¶ 登出
监听 /logout 端点,当你访问 http://localhost:8080/logout 时,清除你的 session,随后将你重定向到 Authing 完成登出。
@GetMapping("/logout") public String logout() { String idToken = (String) session.getAttribute(KEY_ID_TOKEN); // 用户当前未登录 if(idToken == null) { return "redirect:/profile"; } //清空 session session.invalidate(); ILogoutParams params = new ILogoutParams(); // 此处 RedirectUri 的含义是登出回调,可以自定义 params.setRedirectUri("http://localhost:8080/profile"); return "redirect:" + authClientFactory.getObject().buildLogoutUrlWithHost(params); }
复制成功
以上配置完成后,你可以访问 http://localhost:8080/login 登录;可以访问 http://localhost:8080/logout 从你的应用登出,并从 Authing 登出。
¶ 展示用户信息
为了能够展示用户信息,你的应用需要一个受保护的路由。只有登录的用户可以访问,并看到自己的信息。
@ResponseBody @GetMapping("/profile") public String profile() { String accessToken = (String) session.getAttribute(KEY_ACCESS_TOKEN); if(accessToken == null) { return "未登录"; } return authClientFactory.getObject().getUserinfo(accessToken).toString(); }
复制成功
¶ 接下来你可能需要
调用其他资源 API:
Node.js Express API Server 快速开始自建应用 SSO 方案:
单点登录 SSO 综述