Аутентификация тела пост-запроса Unity C# GraphQL

Я пытаюсь подключиться к моему серверу GraphQL, который мои разработчики настроили из Unity. Я нашел несколько сценариев, которые помогут в этом процессе, однако я все еще не могу подключиться, потому что мне нужно войти в систему, в которой размещается graphql, чтобы иметь возможность запрашивать извне, я не могу просто использовать URL-адрес конечной точки.

Мой разработчик сказал мне сделать POST-запрос к mysystem / login и в теле запроса добавить {email: string, password: string}. Я пробовал несколько разных вещей, но ничего не работает. Мне нужно войти в mysystem / login с адресом электронной почты и паролем, тогда я смогу подключиться к конечной точке mygraphql из приведенного ниже кода. - Я предполагал, что эта часть будет идти туда, где у меня есть заметки об аутентификации // smt. Любая помощь о том, как настроить почтовый запрос и где он должен быть или как он должен работать, будет очень признателен.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using SimpleJSON;
using UnityEngine;
using UnityEngine.Networking;

namespace graphQLClient
{
public class GraphQuery : MonoBehaviour
{
    public static GraphQuery instance = null;
    [Tooltip("The url of the node endpoint of the graphQL server being queried")]
    public static string url;

    public delegate void QueryComplete();
    public static event QueryComplete onQueryComplete;

    public enum Status { Neutral, Loading, Complete, Error };

    public static Status queryStatus;
    public static string queryReturn;

    string authURL;
    public static string LoginToken;

    public class Query
    {
        public string query;
    }

    public void Awake()
    {
        if (instance == null)
        {
            instance = this;
        }
        else if (instance != this)
        {
            Destroy(gameObject);
        }

        DontDestroyOnLoad(gameObject);

        StartCoroutine("PostLogin");
    }

    private void Start()
    {
        LoginToken = "";
    }

    public static Dictionary<string, string> variable = new Dictionary<string, string>();
    public static Dictionary<string, string[]> array = new Dictionary<string, string[]>();
    // Use this for initialization

    // SMT Authentication to ELP
    // SMT Needed for Authentication---  if (token != null) request.SetRequestHeader("Authorization", "Bearer " + token);
    //In the request body: {email: string, password: string}
    //You’ll either get a 401 with an empty response or 201 with {token: string, user: object}
    IEnumerator PostLogin()
    {
        Debug.Log("Logging in...");
        string authURL = "https://myapp.com/login";
        string loginBody = "{\"email\":\"myemail.com\",\"password\":\"mypassowrd\"}";

        var request = new UnityWebRequest(authURL, "POST");
        byte[] bodyRaw = new System.Text.UTF8Encoding().GetBytes(loginBody);
        request.uploadHandler = (UploadHandler)new UploadHandlerRaw(bodyRaw);
        request.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
        request.SetRequestHeader("Content-Type", "application/json");

        yield return request.SendWebRequest();

        if (request.isNetworkError || request.isHttpError)
        {
            Debug.Log("Login error!");

            foreach (KeyValuePair<string, string> entry in request.GetResponseHeaders())
            {
                Debug.Log(entry.Value + " = " + entry.Key);
            }

            Debug.Log(request.error);
        }
        else
        {
            Debug.Log("Login complete!");
            //Debug.Log(request.downloadHandler.text);
            LoginToken = request.downloadHandler.text;
            Debug.Log(LoginToken);
        }
    }

    public static WWW POST(string details)
    {
        //var request = new UnityWebRequest(url, "POST");
        details = QuerySorter(details);
        Query query = new Query();
        string jsonData = "";
        WWWForm form = new WWWForm();
        query = new Query { query = details };
        jsonData = JsonUtility.ToJson(query);
        byte[] postData = Encoding.ASCII.GetBytes(jsonData);
        Dictionary<string, string> postHeader = form.headers;
        //postHeader["Authorization"] = "Bearer " + downloadHandler.Token;
        if (postHeader.ContainsKey("Content-Type"))

            //postHeader["Content-Type"] = "application/json";
            postHeader.Add("Authorization", "Bearer " + LoginToken);


        else
            //postHeader.Add("Content-Type", "application/json");
            postHeader.Add("Authorization", "Bearer " + LoginToken);


        WWW www = new WWW(url, postData, postHeader);
        instance.StartCoroutine(WaitForRequest(www));
        queryStatus = Status.Loading;
        return www;
    }

    static IEnumerator WaitForRequest(WWW data)
    {
        yield return data; // Wait until the download is done
        if (data.error != null)
        {
            Debug.Log("There was an error sending request: " + data.error);
            queryStatus = Status.Error;
        }
        else
        {
            queryReturn = data.text;
            queryStatus = Status.Complete;
        }
        onQueryComplete();
    }

    public static string QuerySorter(string query)
    {
        string finalString;
        string[] splitString;
        string[] separators = { "$", "^" };
        splitString = query.Split(separators, StringSplitOptions.RemoveEmptyEntries);
        finalString = splitString[0];
        for (int i = 1; i < splitString.Length; i++)
        {
            if (i % 2 == 0)
            {
                finalString += splitString[i];
            }
            else
            {
                if (!splitString[i].Contains("[]"))
                {
                    finalString += variable[splitString[i]];
                }
                else
                {
                    finalString += ArraySorter(splitString[i]);
                }
            }
        }
        return finalString;
    }

    public static string ArraySorter(string theArray)
    {
        string[] anArray;
        string solution;
        anArray = array[theArray];
        solution = "[";
        foreach (string a in anArray)
        {

        }
        for (int i = 0; i < anArray.Length; i++)
        {
            solution += anArray[i].Trim(new Char[] { '"' });
            if (i < anArray.Length - 1)
                solution += ",";
        }
        solution += "]";
        Debug.Log("This is solution " + solution);
        return solution;
    }

}
}

Я думаю, вам нужно провести небольшой рефакторинг, чтобы вы могли связать две сопрограммы POST вместе. Похоже, вам нужно один раз опубликовать на GraphQL, чтобы получить токен. Как только вы его получите, снова отправьте сообщение со своим запросом с postHeader ["Authorization"] = "Bearer" + firstResponse.Token;

Leo Bartkus 13.04.2018 22:17

@LeoBartkus спасибо за это - я работал со своими разработчиками и смог получить решение для входа в систему по первому запросу POST, см. Обновленный код выше, как вы упомянули - мне просто нужны некоторые рекомендации относительно того, где я передаю postHeader ["Авторизация"] - если предположить второй пост в WWW, но любая дополнительная помощь будет принята с благодарностью - последнее, что меня сдерживает !!! Так близко.

Sean Tarantino 02.05.2018 19:32

Если у вас есть токен, вы можете добавить его в заголовки, где вы добавляете заголовок типа содержимого.

Leo Bartkus 03.05.2018 17:48

@LeoBartkus Кажется, я все еще получаю 401 неавторизованный --- см. Обновленное выше - я, должно быть, что-то упускаю ....

Sean Tarantino 06.05.2018 15:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
908
0

Другие вопросы по теме