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

io.gs2.auth.Gs2AuthRestClient Maven / Gradle / Ivy

The newest version!

/*
 * Copyright 2016 Game Server Services, Inc. or its affiliates. All Rights
 * Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License").
 * You may not use this file except in compliance with the License.
 * A copy of the License is located at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * or in the "license" file accompanying this file. This file is distributed
 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied. See the License for the specific language governing
 * permissions and limitations under the License.
 */

package io.gs2.auth;

import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
import java.io.Serializable;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.JsonNode;

import io.gs2.core.model.AsyncAction;
import io.gs2.core.model.AsyncResult;
import io.gs2.core.exception.*;
import io.gs2.core.net.*;
import io.gs2.core.util.EncodingUtil;

import io.gs2.core.AbstractGs2Client;
import io.gs2.auth.request.*;
import io.gs2.auth.result.*;
import io.gs2.auth.model.*;public class Gs2AuthRestClient extends AbstractGs2Client {

	public Gs2AuthRestClient(Gs2RestSession gs2RestSession) {
		super(gs2RestSession);
	}

    class LoginTask extends Gs2RestSessionTask {
        private LoginRequest request;

        public LoginTask(
            LoginRequest request,
            AsyncAction> userCallback
        ) {
            super(
                    (Gs2RestSession) session,
                    userCallback
            );
            this.request = request;
        }

        @Override
        public LoginResult parse(JsonNode data) {
            return LoginResult.fromJson(data);
        }

        @Override
        protected void executeImpl() {

            String url = Gs2RestSession.EndpointHost
                .replace("{service}", "auth")
                .replace("{region}", session.getRegion().getName())
                + "/login";

            builder.setBody(new ObjectMapper().valueToTree(
                new HashMap() {{
                    put("userId", request.getUserId());
                    put("timeOffset", request.getTimeOffset());
                    put("contextStack", request.getContextStack());
                }}
            ).toString().getBytes());

            builder
                .setMethod(HttpTask.Method.POST)
                .setUrl(url)
                .setHeader("Content-Type", "application/json")
                .setHttpResponseHandler(this);

            if (this.request.getRequestId() != null) {
                builder.setHeader("X-GS2-REQUEST-ID", this.request.getRequestId());
            }
            if (this.request.getTimeOffsetToken() != null) {
                builder.setHeader("X-GS2-TIME-OFFSET-TOKEN", this.request.getTimeOffsetToken());
            }

            builder
                .build()
                .send();
        }
    }

    public void loginAsync(
            LoginRequest request,
            AsyncAction> callback
    ) {
        LoginTask task = new LoginTask(request, callback);
        session.execute(task);
    }

    public LoginResult login(
            LoginRequest request
    ) {
        final AsyncResult[] resultAsyncResult = new AsyncResult[]{null};
        loginAsync(
                request,
                result -> resultAsyncResult[0] = result
        );
        while (resultAsyncResult[0] == null) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {}
        }

        if(resultAsyncResult[0].getError() != null) {
            throw resultAsyncResult[0].getError();
        }

        return resultAsyncResult[0].getResult();
    }

    class LoginBySignatureTask extends Gs2RestSessionTask {
        private LoginBySignatureRequest request;

        public LoginBySignatureTask(
            LoginBySignatureRequest request,
            AsyncAction> userCallback
        ) {
            super(
                    (Gs2RestSession) session,
                    userCallback
            );
            this.request = request;
        }

        @Override
        public LoginBySignatureResult parse(JsonNode data) {
            return LoginBySignatureResult.fromJson(data);
        }

        @Override
        protected void executeImpl() {

            String url = Gs2RestSession.EndpointHost
                .replace("{service}", "auth")
                .replace("{region}", session.getRegion().getName())
                + "/login/signed";

            builder.setBody(new ObjectMapper().valueToTree(
                new HashMap() {{
                    put("keyId", request.getKeyId());
                    put("body", request.getBody());
                    put("signature", request.getSignature());
                    put("contextStack", request.getContextStack());
                }}
            ).toString().getBytes());

            builder
                .setMethod(HttpTask.Method.POST)
                .setUrl(url)
                .setHeader("Content-Type", "application/json")
                .setHttpResponseHandler(this);

            if (this.request.getRequestId() != null) {
                builder.setHeader("X-GS2-REQUEST-ID", this.request.getRequestId());
            }

            builder
                .build()
                .send();
        }
    }

    public void loginBySignatureAsync(
            LoginBySignatureRequest request,
            AsyncAction> callback
    ) {
        LoginBySignatureTask task = new LoginBySignatureTask(request, callback);
        session.execute(task);
    }

    public LoginBySignatureResult loginBySignature(
            LoginBySignatureRequest request
    ) {
        final AsyncResult[] resultAsyncResult = new AsyncResult[]{null};
        loginBySignatureAsync(
                request,
                result -> resultAsyncResult[0] = result
        );
        while (resultAsyncResult[0] == null) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {}
        }

        if(resultAsyncResult[0].getError() != null) {
            throw resultAsyncResult[0].getError();
        }

        return resultAsyncResult[0].getResult();
    }

    class FederationTask extends Gs2RestSessionTask {
        private FederationRequest request;

        public FederationTask(
            FederationRequest request,
            AsyncAction> userCallback
        ) {
            super(
                    (Gs2RestSession) session,
                    userCallback
            );
            this.request = request;
        }

        @Override
        public FederationResult parse(JsonNode data) {
            return FederationResult.fromJson(data);
        }

        @Override
        protected void executeImpl() {

            String url = Gs2RestSession.EndpointHost
                .replace("{service}", "auth")
                .replace("{region}", session.getRegion().getName())
                + "/federation";

            builder.setBody(new ObjectMapper().valueToTree(
                new HashMap() {{
                    put("originalUserId", request.getOriginalUserId());
                    put("userId", request.getUserId());
                    put("policyDocument", request.getPolicyDocument());
                    put("timeOffset", request.getTimeOffset());
                    put("contextStack", request.getContextStack());
                }}
            ).toString().getBytes());

            builder
                .setMethod(HttpTask.Method.POST)
                .setUrl(url)
                .setHeader("Content-Type", "application/json")
                .setHttpResponseHandler(this);

            if (this.request.getRequestId() != null) {
                builder.setHeader("X-GS2-REQUEST-ID", this.request.getRequestId());
            }
            if (this.request.getTimeOffsetToken() != null) {
                builder.setHeader("X-GS2-TIME-OFFSET-TOKEN", this.request.getTimeOffsetToken());
            }

            builder
                .build()
                .send();
        }
    }

    public void federationAsync(
            FederationRequest request,
            AsyncAction> callback
    ) {
        FederationTask task = new FederationTask(request, callback);
        session.execute(task);
    }

    public FederationResult federation(
            FederationRequest request
    ) {
        final AsyncResult[] resultAsyncResult = new AsyncResult[]{null};
        federationAsync(
                request,
                result -> resultAsyncResult[0] = result
        );
        while (resultAsyncResult[0] == null) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {}
        }

        if(resultAsyncResult[0].getError() != null) {
            throw resultAsyncResult[0].getError();
        }

        return resultAsyncResult[0].getResult();
    }

    class IssueTimeOffsetTokenByUserIdTask extends Gs2RestSessionTask {
        private IssueTimeOffsetTokenByUserIdRequest request;

        public IssueTimeOffsetTokenByUserIdTask(
            IssueTimeOffsetTokenByUserIdRequest request,
            AsyncAction> userCallback
        ) {
            super(
                    (Gs2RestSession) session,
                    userCallback
            );
            this.request = request;
        }

        @Override
        public IssueTimeOffsetTokenByUserIdResult parse(JsonNode data) {
            return IssueTimeOffsetTokenByUserIdResult.fromJson(data);
        }

        @Override
        protected void executeImpl() {

            String url = Gs2RestSession.EndpointHost
                .replace("{service}", "auth")
                .replace("{region}", session.getRegion().getName())
                + "/timeoffset/token";

            builder.setBody(new ObjectMapper().valueToTree(
                new HashMap() {{
                    put("userId", request.getUserId());
                    put("timeOffset", request.getTimeOffset());
                    put("contextStack", request.getContextStack());
                }}
            ).toString().getBytes());

            builder
                .setMethod(HttpTask.Method.POST)
                .setUrl(url)
                .setHeader("Content-Type", "application/json")
                .setHttpResponseHandler(this);

            if (this.request.getRequestId() != null) {
                builder.setHeader("X-GS2-REQUEST-ID", this.request.getRequestId());
            }
            if (this.request.getTimeOffsetToken() != null) {
                builder.setHeader("X-GS2-TIME-OFFSET-TOKEN", this.request.getTimeOffsetToken());
            }

            builder
                .build()
                .send();
        }
    }

    public void issueTimeOffsetTokenByUserIdAsync(
            IssueTimeOffsetTokenByUserIdRequest request,
            AsyncAction> callback
    ) {
        IssueTimeOffsetTokenByUserIdTask task = new IssueTimeOffsetTokenByUserIdTask(request, callback);
        session.execute(task);
    }

    public IssueTimeOffsetTokenByUserIdResult issueTimeOffsetTokenByUserId(
            IssueTimeOffsetTokenByUserIdRequest request
    ) {
        final AsyncResult[] resultAsyncResult = new AsyncResult[]{null};
        issueTimeOffsetTokenByUserIdAsync(
                request,
                result -> resultAsyncResult[0] = result
        );
        while (resultAsyncResult[0] == null) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {}
        }

        if(resultAsyncResult[0].getError() != null) {
            throw resultAsyncResult[0].getError();
        }

        return resultAsyncResult[0].getResult();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy