- spring-oauth2-client 客户端(端口:8080)
- spring-oauth2-server Auth服务器(端口:8081)
- spring-oauth2-resource Rest服务器(端口:8082)
版本
ScribeJava 4.1.2 + Spring Security OAuth2 2.0.12
ScribeJava 自身已经提供了很多OAuth开发平台的连接API,这里需要自定义测试Auth服务器的API。
Auth服务器和Rest服务器连接到相同的后台PostgreSQL数据库。
具体实现可以下载源代码查看。 点击下载
相关文章:
Spring Security OAuth2 Provider 之 最小实现
Spring Security OAuth2 Provider 之 数据库存储
Spring Security OAuth2 Provider 之 第三方登录简单演示
Spring Security OAuth2 Provider 之 自定义开发
Spring Security OAuth2 Provider 之 整合JWT
过程如下:
(1)访问客户端首页 http://localhost:8080/
(2)点击signin链接 http://localhost:8080/signin
(3)signin处理中,经由ScribeJava跳转到Auth服务器端认证 http://localhost:8081/oauth/authorize?...
final OAuth20Service service = new ServiceBuilder(CLIENT_ID) .apiSecret(CLIENT_SECRET) .scope(SCOPE) .state(STATE) .callback(CALLBACK_URL) .responseType(RESPONSE_TYPE) .build(MyApi.instance()); final String authorizationUrl = service.getAuthorizationUrl(); response.sendRedirect(authorizationUrl);
(4)Auth服务器端输入用户名密码
(5)Auth服务器端授权
(6)Auth服务器端回调客户端,回传code值 http://localhost:8080/callback
(7)callback处理中,使用code值经由ScribeJava发送请求到Auth服务器端获取AccessToken http://localhost:8081/oauth/token?...
final OAuth20Service service = new ServiceBuilder(CLIENT_ID) .apiSecret(CLIENT_SECRET) .scope(SCOPE) .state(STATE) .callback(CALLBACK_URL) .build(MyApi.instance()); OAuth2AccessToken accessToken = service.getAccessToken(code);
(8)callback处理中,使用AccessToken经由ScribeJava发送请求到Rest服务器获取用户信息 http://localhost:8082/api/profile
final OAuth20Service service = new ServiceBuilder(CLIENT_ID) .apiSecret(CLIENT_SECRET) .scope(SCOPE) .state(STATE) .callback(CALLBACK_URL) .build(MyApi.instance()); final OAuthRequest oauthRequest = new OAuthRequest(Verb.GET, PROFILE_URL); service.signRequest(accessToken, oauthRequest); final Response resourceResponse = service.execute(oauthRequest);
(9)callback处理中,获取到用户信息后显示到客户端
JSONObject obj = new JSONObject(resourceResponse.getBody()); model.addAttribute("id", obj.getString("id")); model.addAttribute("name", obj.getString("name")); model.addAttribute("email", obj.getString("email"));