All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.huaweicloud.sdk.meeting.v1.MeetingCredentials Maven / Gradle / Ivy

package com.huaweicloud.sdk.meeting.v1;

import com.huaweicloud.sdk.core.HcClient;
import com.huaweicloud.sdk.core.auth.ICredential;
import com.huaweicloud.sdk.core.exception.SdkErrorMessage;
import com.huaweicloud.sdk.core.exception.SdkException;
import com.huaweicloud.sdk.core.exception.ServiceResponseException;
import com.huaweicloud.sdk.core.http.HttpClient;
import com.huaweicloud.sdk.core.http.HttpMethod;
import com.huaweicloud.sdk.core.http.HttpRequest;
import com.huaweicloud.sdk.core.http.HttpRequest.HttpRequestBuilder;
import com.huaweicloud.sdk.core.http.HttpResponse;
import com.huaweicloud.sdk.core.utils.JsonUtils;
import com.huaweicloud.sdk.core.utils.StringUtils;
import com.huaweicloud.sdk.meeting.v1.model.AuthReqDTOV1;
import com.huaweicloud.sdk.meeting.v1.model.CreatTokenMeta;
import com.huaweicloud.sdk.meeting.v1.model.CreateTokenResponse;

import java.nio.charset.StandardCharsets;
import java.time.Instant;
import java.util.Base64;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.CompletableFuture;

public class MeetingCredentials implements ICredential {
    private String token;

    private String userName;

    private String userPassword;

    private long lastTokenDate;

    private final static int EXPIRE_HOUR = 24;
    private final static int EXPIRE_HOUR_HALF = EXPIRE_HOUR / 2;

    /**
     * 客户端类型:API调用类型
     */
    private final static int CLIENT_TYPE_API = 72;

    @Override
    public CompletableFuture processAuthParams(HcClient hcClient, String regionId) {
        return CompletableFuture.completedFuture(this);
    }

    @Override
    public CompletableFuture processAuthRequest(HttpRequest httpRequest, HttpClient httpClient) {

        if (httpRequest.getPath().startsWith("/v1/mmc/control/conferences")
            || httpRequest.getPath().startsWith("/v1/usg/acs/auth/slideverifycode")
            || httpRequest.getPath().startsWith("/v1/usg/acs/verifycode")) {
            return CompletableFuture.supplyAsync(() -> httpRequest);
        }

        // 用户忘记密码重置接口需要上送X-Access-Token头域,但不是用户登陆的token,是校验验证码接口返回的token
        if (httpRequest.getPath().startsWith("/v1/usg/acs/password/reset")) {
            return CompletableFuture.supplyAsync(
                () -> httpRequest.builder().addHeader("X-Access-Token", this.token).build());
        }

        // 新增获取页面免登陆跳转nonce信息接口也需上送X-Access-Token头域,但不是用户登陆的token,需用户自己上送
        // 如果用户自己上送了,则设置用户自带的token, 否则则设置通过用户名密码获取的token
        if (httpRequest.getPath().startsWith("/v1/usg/acs/auth/portal-ref-nonce") && !StringUtils.isEmpty(token)) {
            return CompletableFuture.supplyAsync(
                () -> httpRequest.builder().addHeader("X-Access-Token", this.token).build());
        }

        if (Objects.isNull(userName) || Objects.isNull(userPassword)) {
            throw new SdkException("Input your user name and password");
        }

        long exp = Instant.now().getEpochSecond() - this.lastTokenDate;

        CompletableFuture validToken = CompletableFuture.completedFuture(this.token);

        if (Objects.isNull(token) || exp > EXPIRE_HOUR_HALF * 60 * 60) {
            validToken = createToken(httpRequest, httpClient);
        }

        return validToken.thenApply(tokenStr -> {
            HttpRequestBuilder builder = httpRequest.builder();
            if (!StringUtils.isEmpty(tokenStr)) {
                builder.addHeader("X-Access-Token", tokenStr);
            }
            return builder.build();
        });
    }

    @Override
    public MeetingCredentials deepClone() {
        return new MeetingCredentials()
                .withToken(this.token)
                .withUserName(this.userName)
                .withUserPassword(this.userPassword);
    }

    private CompletableFuture createToken(HttpRequest httpRequest, HttpClient httpClient) {
        byte[] bytes =
            (userName + ":" + userPassword).getBytes(StandardCharsets.UTF_8);
        String authorization =
            "Basic " + Base64.getEncoder().encodeToString(bytes);

        String requestBody = JsonUtils.toJSON(new AuthReqDTOV1().withAccount(userName).withClientType(CLIENT_TYPE_API));
        HttpRequest createTokenRequest = HttpRequest.newBuilder()
            .withEndpoint(httpRequest.getEndpoint())
            .withMethod(HttpMethod.POST)
            .withPath(CreatTokenMeta.URI)
            .withContentType(CreatTokenMeta.CONTENT_TYPE)
            .addHeader("Authorization", authorization)
            .withBodyAsString(requestBody).build();
        return httpClient.asyncInvokeHttp(createTokenRequest).handle((createTokenHttpResponse, e) -> {
            if (Objects.nonNull(e)) {
                throw new SdkException(e);
            }
            if (createTokenHttpResponse.getStatusCode() != 200) {
                throw ServiceResponseException
                    .mapException(createTokenHttpResponse.getStatusCode(),
                        extractErrorMessage(createTokenHttpResponse));
            }
            CreateTokenResponse createTokenResponse
                = JsonUtils.toObject(createTokenHttpResponse.getBodyAsString(), CreateTokenResponse.class);
            this.token = createTokenResponse.getAccessToken();
            this.lastTokenDate = Instant.now().getEpochSecond();
            return this.token;
        });
    }

    private SdkErrorMessage extractErrorMessage(HttpResponse httpResponse) {
        String strBody = httpResponse.getBodyAsString();
        SdkErrorMessage sdkErrorMessage = new SdkErrorMessage(httpResponse.getStatusCode());
        if (Objects.isNull(strBody)) {
            return sdkErrorMessage;
        }
        try {
            Map errResult = JsonUtils.toObject(strBody, Map.class);
            sdkErrorMessage.setErrorCode(errResult.get("error_code").toString());
            sdkErrorMessage.setErrorMsg(errResult.get("error_msg").toString());
            sdkErrorMessage.setRequestId(errResult.get("request_id").toString());
        } catch (SdkException e) {
            sdkErrorMessage.setErrorMsg(httpResponse.getBodyAsString());
        }
        return sdkErrorMessage;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public MeetingCredentials withUserName(String userName) {
        this.userName = userName;
        return this;
    }

    public String getUserPassword() {
        return userPassword;
    }

    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword;
    }

    public MeetingCredentials withUserPassword(String userPassword) {
        this.userPassword = userPassword;
        return this;
    }

    public MeetingCredentials withToken(String token) {
        this.token = token;
        return this;
    }
}






© 2015 - 2025 Weber Informatics LLC | Privacy Policy