Jetzt teilnehmen:Online-Umfrage zur Verbesserung von DRACOONMehr Infos

Kundenanfrage: C# OAuth Client unauthorized

Kommentare

7 Kommentare

  • Offizieller Kommentar
    Avatar
    Michael Netter

    Hallo,

    um eine Fehleranalyse machen zu können, können Sie den gesamten Code, den sie zur Initialisierung des DracoonClient nutzen, hier posten (Credentials können sie unkenntlich machen)?

    Viele Grüße

    Michael Netter 

     

    Aktionen für Kommentare Permalink
  • Avatar
    info Burkom

    XXXXXXXXXX in der Server Uri ist eine 10 stellige Nummer, über diesen Link melden wir uns bei der Web App an.
    CLIENT_ID und CLIENT_SECRET wurden beim anlegen einer Custom App in der Web App automatisch generiert und so übernommen.
    Der Fehler tritt beim abrufen der Nodes (in der UseClient Methode) in Zeile 81 auf.
    Aufgerufen wird die Klasse mit new Test();

    Viele Grüße

    using Dracoon.Sdk;
    using Dracoon.Sdk.Model;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Security.Cryptography;
    using System.Text;
    using System.Threading.Tasks;

    namespace Dracoon
    {
    public class Test
    {
    private static readonly Uri SERVER_URI = new Uri("https://XXXXXXXXXX.dracoon.cloud");
    private static readonly string CLIENT_ID = ""; //Übernommen aus den Custom App Einstellungen in der Web App
    private static readonly string CLIENT_SECRET = ""; //Übernommen aus den Custom App Einstellungne in der Web App
    private static readonly int REDIRECT_PORT = 10000;

    public Test()
    {
    // Authorize client
    string authCode = AuthorizeClient();

    // Initialize dracoon client
    DracoonClient client = CreateClient(authCode);

    // Use client
    UseClient(client);

    // After first usage of client the access and refresh tokens are retrieved and can be persisted
    string accessToken = client.Auth.AccessToken;
    string refreshToken = client.Auth.RefreshToken;
    }

    private static string AuthorizeClient()
    {
    string state = GenerateRandomBase64(32);

    // Create authorization uri
    Uri authUrl = OAuthHelper.CreateAuthorizationUrl(SERVER_URI, CLIENT_ID, state);

    // Open authorization URL in user's browser and wait for callback
    Uri loginResultUri = Login(authUrl).Result;

    // Extract the state and code from callback uri
    string callbackState = OAuthHelper.ExtractAuthorizationStateFromUri(loginResultUri);
    string callbackCode = OAuthHelper.ExtractAuthorizationCodeFromUri(loginResultUri);

    // Check state
    if (!state.Equals(callbackState))
    {
    throw new Exception("Received OAuth state is not the same as expected!");
    }
    return callbackCode;
    }

    private async static Task<Uri> Login(Uri authUrl)
    {
    using (HttpListener callbackListener = new HttpListener())
    {
    callbackListener.Prefixes.Add("http://localhost:" + REDIRECT_PORT + "/");
    callbackListener.Start();
    System.Diagnostics.Process.Start(authUrl.ToString());
    HttpListenerContext context = await callbackListener.GetContextAsync();
    return context.Request.Url;
    }
    }

    private static DracoonClient CreateClient(string authCode)
    {
    // Init the auth object with the authCode
    DracoonAuth auth = new DracoonAuth(CLIENT_ID, CLIENT_SECRET, authCode);

    // Create a dracoon client with default settings but with authorization
    return new DracoonClient(SERVER_URI, auth);
    }

    private static void UseClient(DracoonClient client)
    {
    NodeList rootNodes = client.Nodes.GetNodes();
    foreach (Node current in rootNodes.Items)
    {
    Console.WriteLine("NodeId: " + current.Id + "; NodeName: " + current.Name);
    }
    }

    private static string GenerateRandomBase64(int length)
    {
    RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
    byte[] randomBytes = new byte[length];
    rng.GetBytes(randomBytes);
    return EncodeByteArrayToUrlEncodedBase64(randomBytes);
    }

    internal static string EncodeByteArrayToUrlEncodedBase64(byte[] bytes)
    {
    string base64 = Convert.ToBase64String(bytes);
    base64 = base64.Replace("+", "-");
    base64 = base64.Replace("/", "_");
    base64 = base64.Replace("=", "");
    return base64;
    }
    }
    }
    0
    Aktionen für Kommentare Permalink
  • Avatar
    Michael Netter

    Vielen Dank für Ihr Codebeispiel.

    Wir können das Problem leider nicht reproduzieren; ihr Code funktioniert bei uns einwandfrei. Um das Problem einzugrenzen, würden wir Ihnen temporär auf einer unserer Umgebungen einen OAuth-Client und einen Testnutzer anlegen. Die Daten übermitteln wir Ihnen über das Ticketsystem. Können Sie bitte Ihren Code mit diesen Daten erneut testen?

    Viele Grüße

    Michael Netter

    0
    Aktionen für Kommentare Permalink
  • Avatar
    info Burkom

    Danke für die Testdaten, 

    damit hat der Code auch bei mir problemlos funktioniert.

    Ich habe verschiedene Einstellungen bei uns in der Web App getestet, aber ich bekomme bei allen einen Fehler.

    Viele Grüße

    0
    Aktionen für Kommentare Permalink
  • Avatar
    Michael Netter

    Vielen Dank für Ihre Rückmeldung.

    Der Statuscode 401 könnte in Ihrem Fall daran liegen, dass das CLIENT_SECRET nicht korrekt ist. Können Sie das nochmals prüfen?

    Falls das nicht der Fall ist, können Sie einen Testnutzer anlegen und uns die Zugangsdaten und CLIENT_ID und CLIENT_SECRET über das Ticketsystem mitteilen?

    Viele Grüße

    Michael Netter

    0
    Aktionen für Kommentare Permalink
  • Avatar
    info Burkom

    Der Fehler war tatsächlich ein Schreibfehler im CLIENT_SECRET. 

    Etwas peinlich, dass der Fehler ausgerechnet beim kopieren zustande kommt aber jetzt funktioniert alles.

    Vielen Dank für die Hilfe und viele Grüße

    0
    Aktionen für Kommentare Permalink
  • Avatar
    Michael Netter

    Super, das freut uns sehr!

    Viele Grüße
    Michael Netter

    0
    Aktionen für Kommentare Permalink

Bitte melden Sie sich an, um einen Kommentar zu hinterlassen.