如何在不提供凭据的情况下在浏览器中使用 Kinesis Video Stream WebRTC SDK?

How to use Kinesis Video Stream WebRTC SDK in the browser without providing credentials?

我想使用 kinesis video streams webrtc javascript sdk 从网页生成视频流。 The sdk readme 说我需要提供 accessKeyIdsecrectAccessKey

signalingClient = new KVSWebRTC.SignalingClient({
    channelARN,
    channelEndpoint: endpointsByProtocol.WSS,
    clientId,
    role: KVSWebRTC.Role.VIEWER,
    region,
    credentials: {
        accessKeyId,
        secretAccessKey,
    },
    systemClockOffset: kinesisVideoClient.config.systemClockOffset,
});

有没有办法让它更安全并避免在 javascript 代码中提供秘密访问密钥? 这是否意味着任何查看我的网页源代码的人都可以从网页中获取这些凭据并使用它们来访问信令通道? 我可以使用 amplify-js Auth class 将信令客户端与经过身份验证的用户一起使用吗?

原来我可以在后端使用凭据,并使用 class SigV4RequestSigner 向客户端发送预签名的 link。 无需在客户端提供凭据。

documentation:

中找到

This is a useful class to use in a NodeJS backend to sign requests and send them back to a client so that the client does not need to have AWS credentials.

创建 SignalingClient 时,您可以指定 returns 和 Promise<string> 的凭据或 requestSigner,请参阅:

https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-js/blob/master/README.md#class-signalingclient

credentials {object} Must be provided unless a requestSigner is provided.

请注意,如果不在浏览器中使用凭据,您还需要在服务器端 运行 KinesisVideoSignalingChannels 相关代码,因为此 class 不支持请求签名者.

对于 Kinesis,一种可能性是在您的 NodeJS 后端中实现一个用于对您的 URL 进行签名的功能。

const endpointsByProtocol = getSignalingChannelEndpointResponse.ResourceEndpointList.reduce((endpoints, endpoint) => {
    endpoints[endpoint.Protocol] = endpoint.ResourceEndpoint;
    return endpoints;
}, {});
console.log('[VIEWER] Endpoints: ', endpointsByProtocol);

const region = "us-west-2";
const credentials = {
    accessKeyId: "XAXAXAXAXAX",
    secretAccessKey: "SECRETSECRET"
};
const queryParams = {
    'X-Amz-ChannelARN': channelARN,
    'X-Amz-ClientId': formValues.clientId
}
const signer = new SigV4RequestSigner(region, credentials);
const url = await signer.getSignedURL(endpointsByProtocol.WSS, queryParams);
console.log(url);