使用jap-http-api
提示
jap-http-api 支持 Basic、Digest 和 Bearer 等方式
# 引入依赖
<dependency>
<groupId>com.fujieid</groupId>
<artifactId>jap-http-api</artifactId>
<version>{latest-version}</version>
</dependency>
<!--
jap 已经使用 simple-json 解耦 json 类库,开发者只需要选择适合的依赖引入即可,支持依赖:
- jackson
- fastjson
- gson
- hutool-json
关于 simple-json 更多使用方式参考:https://github.com/xkcoding/simple-json
-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
</dependency>
<!--
jap 已经使用 simple-http 解耦 http 类库,开发者只需要选择适合的依赖引入即可,支持依赖:
- java 11 HttpClient
- OkHttp3
- apache HttpClient
- hutool-http
关于 simple-http 更多使用方式参考:https://github.com/xkcoding/simple-http
-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-http</artifactId>
<version>5.2.5</version>
</dependency>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 实现 JapUserService
JapUserService
是 JAP 调用(操作)开发者业务系统中的用户接口。使用 jap-http-api
模块时,如果指定的认证 HTTP 认证方式是 Bearer 认证,则需要实现 saveHttpAuthedJapUser
方法和 getByName
方法。
public class JapHttpApiUserServiceImpl implements JapUserService {
private static List<JapUser> userDatas = new ArrayList<>();
@Override
public JapUser getByName(String username) {
return userDatas.stream().filter((user) -> user.getUsername().equals(username)).findFirst().orElse(null);
}
@Override
public void saveHttpAuthedJapUser(JapUser japUser) {
// 删除数据库中与 japUser 用户名重复的用户
userDatas = userDatas.stream().filter((japUser1 -> {
return !japUser1.getUsername().equals(japUser.getUsername());
})).collect(Collectors.toList());
userDatas.add(japUser);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 实现 Controller
import com.fujieid.jap.core.cache.JapLocalCache;
import com.fujieid.jap.core.config.JapConfig;
import com.fujieid.jap.core.result.JapResponse;
import com.fujieid.jap.http.adapter.jakarta.JakartaRequestAdapter;
import com.fujieid.jap.http.adapter.jakarta.JakartaResponseAdapter;
import com.fujieid.jap.httpapi.HttpApiConfig;
import com.fujieid.jap.httpapi.HttpApiStrategy;
import com.fujieid.jap.httpapi.enums.AuthInfoFieldEnum;
import com.fujieid.jap.httpapi.enums.AuthSchemaEnum;
import com.fujieid.jap.httpapi.enums.HttpMethodEnum;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@RestController
@RequestMapping("/httpauth")
public class BasicAuthController {
@PostMapping("/basic")
public JapResponse login(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
// 配置必要参数
HttpApiConfig httpApiConfig = new HttpApiConfig();
httpApiConfig.setHttpMethod(HttpMethodEnum.GET);
httpApiConfig.setAuthInfoField(AuthInfoFieldEnum.BODY);
httpApiConfig.setAuthSchema(AuthSchemaEnum.BASIC);
httpApiConfig.setLoginUrl("http://httpbin.org/basic-auth/foo/bar");
// 执行认证
HttpApiStrategy httpApiStrategy = new HttpApiStrategy(new JapHttpApiUserServiceImpl(), new JapConfig(), new JapLocalCache());
// 获取认证结果
return httpApiStrategy.authenticate(httpApiConfig, new JakartaRequestAdapter(httpServletRequest), new JakartaResponseAdapter(httpServletResponse));
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
在执行 httpApiStrategy#authenticate 方法时需要使用
JakartaRequestAdapter
和JakartaResponseAdapter
将httpServletRequest
和httpServletResponse
转换为JapHttpRequest
和JapHttpResposne
。
# 测试登录
使用 Postman 测试通过 /httpauth/basic
接口是否能够成功通过第三方系统的认证。
# 配置项说明
参数名 | 参数类型 |
---|---|
authSchema | AuthSchemaEnum |
httpMethod | HttpMethodEnum |
loginUrl | String |
authInfoField | AuthInfoFieldEnum |
customHeaders | Map<String, String> |
customParams | Map<String, String> |
customBody | Map<String, String> |
bearerTokenIssueUrl | String |
requestBodyToJapUserStrategy | RequestBodyToJapUserStrategy 接口 |
forBearerTokenEnum | ForBearerTokenEnum |
getTokenFromResponseStrategy | GetTokenFromResponseStrategy 接口 |
authSchema
: 必填。HTTP 认证方式,可选值有 BASIC,DIGEST,BEARERhttpMethod
:必填。请求第三方系统的请求方式,可选值有 GET,POSTloginUrl
:必填。第三方系统提供的登录地址authInfoField
:必填。用户传入本系统的用户信息存放位置,可选值有 HEADER,PARAMS,BODYcustomHeaders
:非必填。自定义请求头,请求第三方系统时携带customParams
:非必填。自定义请求参数,请求第三方系统时携带customBody
:非必填。自定义请求体,请求第三方系统时携带。会将 Map 中 的键值对以 json 的方式拼接为 json 字符串之后当作请求体bearerTokenIssueUrl
: 当authSchema
为 BEARER 时必填。 Bearer Token 的签发请求地址requestBodyToJapUserStrategy
:当authInfoField
为 BODY 时必填。这个字段用于指定从 RequestBody 解析出 JapUser 的 username 和 password 的策略。提供默认实现:以 json 的方式解析出 username 和 passwordforBearerTokenEnum
:当authSchema
为 BEARER 时必填。Bearer 认证预请求方式,这个是用来指定在进行 Token 签发时用户信息如何发送到第三方。可选值有 BY_HEADER,BY_PARAMS,BY_BODY,BY_BASIC,BY_DIGESTgetTokenFromResponseStrategy
:当authSchema
为 BEARER 时必填。这个字段用于指定从 Resposne 中解析出 token 的策略。提供默认实现:以 json 的方式解析出 token。
# 官方推荐
- ⨳ jap-http-api 前后端分离项目示例:jap-http-api-demo (opens new window)