awslabs / amazon-kinesis-video-streams-webrtc-sdk-android

Android SDK for interfacing with Amazon Kinesis Video Streams Signaling Service.
Apache License 2.0
58 stars 37 forks source link

Describe Signaling Channel failed 403 AccessDeniedException #57

Closed mjkimloan closed 3 years ago

mjkimloan commented 3 years ago

I am trying to use kinesisVideoStream APi in guest mode without logging in. but, When I call the UpdateSignalingChannelInfoTask method, I get an AccessDeniedException (Describe Signaling Channel failed with Exception) error message. I know this is an error because the state of userState is not authorized in the SIGNED_OUT state. Is there a method like AWSMobileClient.default().clearCredentials() for userState value like ios? Or is there a solution?

** There is no problem with the Provider information in the awsconfiguration.json file.

Below is the code I tried.

static class UpdateSignalingChannelInfoTask extends AsyncTask<Object, String, String> { final WeakReference mFragment;

    UpdateSignalingChannelInfoTask(final StreamWebRtcConfigurationFragment fragment) {
        mFragment = new WeakReference<>(fragment);
    }

    @Override
    protected String doInBackground(Object... objects) {
        final String region = (String) objects[0];
        final String channelName = (String) objects[1];
        final ChannelRole role = (ChannelRole) objects[2];

           **// my insert code start
           CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
                requireContext(),
                null,
                "myIdentityPoolId",
                "myunauthRoleArn",
                "myauthRoleArn",
                Regions.AP_NORTHEAST_2
        );
        credentialsProvider.clearCredentials();
        credentialsProvider.getCredentials();
       // my insert code end**

        AWSKinesisVideoClient awsKinesisVideoClient = null;
        try {
            awsKinesisVideoClient = mFragment.get().getAwsKinesisVideoClient(region);
        } catch (Exception e) {
            return "Create client failed with " + e.getLocalizedMessage();
        }

        try {
            DescribeSignalingChannelResult describeSignalingChannelResult = awsKinesisVideoClient.describeSignalingChannel(
                    new DescribeSignalingChannelRequest()
                            .withChannelName(channelName));

            Log.i(TAG, "Channel ARN is " + describeSignalingChannelResult.getChannelInfo().getChannelARN());
            mFragment.get().mChannelArn = describeSignalingChannelResult.getChannelInfo().getChannelARN();
        } catch (final ResourceNotFoundException e) {
            if (role.equals(ChannelRole.MASTER)) {
                try {
                    CreateSignalingChannelResult createSignalingChannelResult = awsKinesisVideoClient.createSignalingChannel(
                            new CreateSignalingChannelRequest()
                                    .withChannelName(channelName));

                    mFragment.get().mChannelArn = createSignalingChannelResult.getChannelARN();
                } catch (Exception ex) {
                    return "Create Signaling Channel failed with Exception " + ex.getLocalizedMessage();
                }
            } else {
                return "Signaling Channel " + channelName +" doesn't exist!";
            }
        } catch (Exception ex) {
            return "Describe Signaling Channel failed with Exception " + ex.getLocalizedMessage();
        }

        try {
            GetSignalingChannelEndpointResult getSignalingChannelEndpointResult = awsKinesisVideoClient.getSignalingChannelEndpoint(
                    new GetSignalingChannelEndpointRequest()
                            .withChannelARN(mFragment.get().mChannelArn)
                            .withSingleMasterChannelEndpointConfiguration(
                                    new SingleMasterChannelEndpointConfiguration()
                                            .withProtocols("WSS", "HTTPS")
                                            .withRole(role)));

            Log.i(TAG, "Endpoints " + getSignalingChannelEndpointResult.toString());
            mFragment.get().mEndpointList.addAll(getSignalingChannelEndpointResult.getResourceEndpointList());
        } catch (Exception e) {
            return "Get Signaling Endpoint failed with Exception " + e.getLocalizedMessage();
        }

        String dataEndpoint = null;
        for (ResourceEndpointListItem endpoint : mFragment.get().mEndpointList) {
            if (endpoint.getProtocol().equals("HTTPS")) {
                dataEndpoint = endpoint.getResourceEndpoint();
            }
        }

        try {
            final AWSKinesisVideoSignalingClient awsKinesisVideoSignalingClient = mFragment.get().getAwsKinesisVideoSignalingClient(region, dataEndpoint);
            GetIceServerConfigResult getIceServerConfigResult = awsKinesisVideoSignalingClient.getIceServerConfig(
                    new GetIceServerConfigRequest().withChannelARN(mFragment.get().mChannelArn).withClientId(role.name()));
            mFragment.get().mIceServerList.addAll(getIceServerConfigResult.getIceServerList());
        } catch (Exception e) {
            return "Get Ice Server Config failed with Exception " + e.getLocalizedMessage();
        }

        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        if (result != null) {
            AlertDialog.Builder diag = new AlertDialog.Builder(mFragment.get().getContext());
            diag.setPositiveButton("OK", null).setMessage(result).create().show();
        }
    }
}
mjkimloan commented 3 years ago

This Problem is Solved. but, I missed the API documentation for the exact resolution.

       CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
            requireContext(),
            null,
            "myIdentityPoolId",
            "myunauthRoleArn",
            "myauthRoleArn",
            Regions.AP_NORTHEAST_2
    );
    credentialsProvider.clearCredentials();
    **credentialsProvider.getIndentityId();**