如何在graphQL中为订阅设置身份验证/授权

时间:2020-08-13 13:16:41

标签: graphql hotchocolate

目前,我已经在websocket上设置了拦截器,以检查用户是否被授权使用我们的系统

services.AddWebSocketConnectionInterceptor(async (context, props, cancellationToken) =>
        {
            string token = "PreAssignment";
            try
            {
                token = props["Authorization"].ToString();
                if (token != null && token != "")
                {
                    HttpClient _httpClient = new HttpClient();
                    _httpClient.DefaultRequestHeaders.Add("Authorization", token);
                    HttpResponseMessage response = await _httpClient.GetAsync("authurl");
                    if (response.IsSuccessStatusCode)
                    {
                        string content = await response.Content.ReadAsStringAsync();
                        dynamic userInfo = JSON.Deserialize<object>(content, new Jil.Options(serializationNameFormat: SerializationNameFormat.CamelCase) { });
                        IEnumerable<string> roles = userInfo.role;
                        if (roles.Contains("rolename"))
                        {
                            return ConnectionStatus.Accept();
                        }
                    }
                }
                return ConnectionStatus.Reject();
            }
            catch (Exception ex)
            {
                var e = new Exception("Web Socket Error connecting to Auth. Token: " + token, ex);
                throw e;
            }

我的问题是稍后,我需要访问令牌中的一些信息,以确保某人无法将其他过滤参数的用户注入到订阅中以获取不是他们的数据。

现在,我在前端手动传递一个clientId。我更希望将其从令牌获取到订阅。这样做的问题是,对于有人在前端注入其他clientId并获取他们也不应该能够获取的数据,我感到很敬畏。

[ExtendObjectType(Name = "Subscription")]
public class PeopleSubscriptions
{
    public People OnPeoplelUpsert(int clientId, IEventMessage message)
    {
        return (People)message.Payload;
    }
}

我对websockets非常陌生。我想知道的是,是否存在将信息填充到令牌中的位置,这样我就不必传递clientId,而只需将其从令牌中拉出即可。现在,我正在考虑尝试创建一个范围仅限于websocket的依赖项(我是websockets的新手,所以idk,如果这行得通的话),但是如果有人有任何想法,我将不胜感激!

0 个答案:

没有答案
相关问题