public override AsyncUnaryCall <TResponse> AsyncUnaryCall <TRequest, TResponse>(
            TRequest request,
            ClientInterceptorContext <TRequest, TResponse> context,
            AsyncUnaryCallContinuation <TRequest, TResponse> continuation)
        {
            var now      = Util.EpochTimeMillis();
            var keyLevel = authentication.KeyLevel;
            var signer   = crypto.CreateSigner(keyLevel);
            var payload  = new GrpcAuthPayload
            {
                Request     = ByteString.CopyFrom(((IMessage)request).ToByteArray()),
                CreatedAtMs = now
            };
            var signature = signer.Sign(payload);
            var metadata  = context.Options.Headers ?? new Metadata();

            metadata.Add("token-realm", "Token");
            metadata.Add("token-scheme", "Token-Ed25519-SHA512");
            metadata.Add("token-key-id", signer.GetKeyId());
            metadata.Add("token-signature", signature);
            metadata.Add("token-created-at-ms", now.ToString());
            metadata.Add("token-member-id", memberId);
            metadata.Add("token-security-metadata", encodeSecurityMetadata(authentication));

            if (authentication.OnBehalfOf != null)
            {
                metadata.Add("token-on-behalf-of", authentication.OnBehalfOf);
                metadata.Add("customer-initiated", authentication.CustomerInitiated.ToString());
            }

            return(continuation(request,
                                new ClientInterceptorContext <TRequest, TResponse>(context.Method, context.Host,
                                                                                   context.Options.WithHeaders(metadata))));
        }
Esempio n. 2
0
        public override AsyncUnaryCall <TResponse> AsyncUnaryCall <TRequest, TResponse>(
            TRequest request,
            ClientInterceptorContext <TRequest, TResponse> context,
            AsyncUnaryCallContinuation <TRequest, TResponse> continuation)
        {
            var now      = Util.EpochTimeMillis();
            var keyLevel = authentication.KeyLevel;
            var signer   = crypto.CreateSigner(keyLevel);
            var payload  = new GrpcAuthPayload
            {
                Request     = ByteString.CopyFrom(((IMessage)request).ToByteArray()),
                CreatedAtMs = now
            };
            var signature = signer.Sign(payload);
            var metadata  = context.Options.Headers ?? new Metadata();

            metadata.Add(TOKEN_REALM, "Token");
            metadata.Add(TOKEN_SCHEME, "Token-Ed25519-SHA512");
            metadata.Add(TOKEN_KEY_ID, signer.GetKeyId());
            metadata.Add(TOKEN_SIGNATURE, signature);
            metadata.Add(TOKEN_CREATED_AT_MS, now.ToString());
            metadata.Add(TOKEN_MEMBER_ID, memberId);

            var customer = authentication.CustomerTrackingMetadata;

            if (!string.IsNullOrEmpty(customer.IpAddress))
            {
                metadata.Add(CUSTOMER_IP_ADDRESS_KEY,
                             customer.IpAddress);
            }
            if (!string.IsNullOrEmpty(customer.GeoLocation))
            {
                metadata.Add(CUSTOMER_GEO_LOCATION_KEY,
                             customer.GeoLocation);
            }
            if (!string.IsNullOrEmpty(customer.DeviceId))
            {
                metadata.Add(CUSTOMER_DEVICE_ID_KEY,
                             customer.DeviceId);
            }

            if (authentication.OnBehalfOf != null)
            {
                metadata.Add(TOKEN_ON_BEHALF_OF, authentication.OnBehalfOf);
                metadata.Add(CUSTOMER_INITIATED, authentication.CustomerInitiated.ToString());
            }

            return(continuation(request,
                                new ClientInterceptorContext <TRequest, TResponse>(context.Method, context.Host,
                                                                                   context.Options.WithHeaders(metadata))));
        }