Skip to content

身份认证

挑战方法

该方法用于获取挑战信息,为一随机nounce值。

方法调用

java
DoipReturn<String> challenge(@RequestParam(value = "handle") String handle);

注意:该方法只允许应用身份调用,其他身份调用无法获取nounce值。

方法参数

参数类型是否必填最大长度备注示例值
handleString255要查询的标识88.608.8889/App_wscapp

返回参数

名称类型必选约束中文名说明
codeintegertruenonenone返回码
messagestringtruenonenone返回消息
dataobjecttruenonenone返回数据

请求示例

java
@Test
void challengeTest() {
    new OpenApiClient().challenge(handle, url);
}

//方法
public String challenge(String handle, String url) {

    // 构建挑战应答API
    this.challengeResponseApi = Feign.builder()
        .encoder(encoder)
        .decoder(responseEntityDecoder)
        .contract(contract)
        .retryer(Retryer.NEVER_RETRY)
        .target(ChallengeResponseApi.class, url);
    // 挑战
    DoipReturn < String > challengeResponse = challengeResponseApi.challenge(handle);
    String random = challengeResponse.getData();
    log.info("{} 挑战成功!返回结果{}", handle, challengeResponse);
    return random;

}

响应示例

json
{
    "code": 1,
    "message": "成功",
    "data": "4870"
}

应答,颁发Token

该方法用于验证使用nonce值生成的signature,验证成功则颁发token。

方法调用

java
DoipReturn<Map<String,Object>> verifyResponse(@RequestBody VerifyResponseDTO verifyResponseDTO);

方法参数

名称位置类型必选说明
handlebodystring应用标识身份88.608.8889/App_wscapp
signaturebodystring私钥进行签名

返回参数

名称类型必选约束中文名说明
codeintegertruenonenone返回码
messagestringtruenonenone返回消息
dataobjecttruenonenone
data.tokenstringtruenonenone返回token

请求示例

java
@Test
void challengeResponseTest() {
    OpenApiClient openApiClient = new OpenApiClient(url, handle, privateKeyPem);
}

//创建OpenApiClient对象
public OpenApiClient(String url, String handle, String privateKeyPem) {
    this();
    log.info("{} 开始挑战", handle);
    // 构建挑战应答API
    this.challengeResponseApi = Feign.builder()
        .encoder(encoder)
        .decoder(responseEntityDecoder)
        .contract(contract)
        .retryer(Retryer.NEVER_RETRY)
        .target(ChallengeResponseApi.class, url);
    // 认证
    String token = authenticate(handle, privateKeyPem);

}

/**
 * 鉴权获取token
 * @return
 */
private String authenticate(String handle, String privateKeyPem) {
    try {
        // 挑战
        DoipReturn<String> challengeResponse = challengeResponseApi.challenge(handle);
        String random = challengeResponse.getData();
        // 签名
        PrivateKey privateKey = KeyConverter.fromPkcs8Pem(privateKeyPem);
        String sign = EncryptionUtils.sign(random.getBytes(StandardCharsets.UTF_8), privateKey);
        // 应答
        VerifyResponseDTO verifyResponseDTO = new VerifyResponseDTO();
        verifyResponseDTO.setHandle(handle);
        verifyResponseDTO.setSignature(sign);
        DoipReturn<Map<String, Object>> verifyResponse = challengeResponseApi.verifyResponse(verifyResponseDTO);
        if (!Objects.equals(verifyResponse.getCode(), DoipClientCodeEnum.SUCCESS.getCode())) {
            throw new RuntimeException("挑战失败");
        }
        log.info("{} 挑战应答成功!", handle);
        return verifyResponse.getData().get("token").toString();
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

响应示例

json
{
    "code": 1,
    "message": "成功",
    "data": {
        "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI4OC42MDguODg4L0FwcF96ajAxIiwiZXhwIjoxNzAyNTQyMTM0LCJpYXQiOjE3MDI0NTU3MzQsImp0aSI6IjMxMzlmNDVkLTA5YzAtNDljZS04MTdkLWE4NDRhZmFlZTFjMyJ9.9Akw3pAwMM-tHZ6WOB6OI4E_ZMvDKyRn6CPYD1TWahc"
    }
}

Released under the MIT License.