Kundenanfrage: C# OAuth Client unauthorized
Übertrage die Kundenanfrage aus unserem Support in die Community.
Anfrage:
Ich versuche aktuell mich mit dem Dracoon SDK für C# anzumelden.
Dazu folge ich eurem Beispiel auf Github: (https://github.com/dracoon/dracoon-csharp-sdk/blob/master/DracoonSdkExample/OAuthExamples.cs)
Ich habe auf der Website unter Settings -> Apps -> CustomApps eine neue App angelegt mit dem Grant Type authorization_code. Die automatisch generierte Client ID und das Client Secret habe ich in den Code übernommen.
Die SERVER_URI im Code habe ich zu unserer Server Adresse geändert.
Wenn ich das Programm ausführe öffnet sich mein Browser und ich soll mich anmelden und den Zugriff meiner App authorisieren (siehe Screenshot1). Daraufhin bekomme ich im Programm auch eine Url mit einem Authorization State und Code. Mit dem Code kann ich auch erfolgreich die Dracoon Auth und Client Objekte erstellen.
Beim Abrufen der Nodes erhalte ich dann allerdings eine Exception:
Dracoon.Sdk.Error.DracoonApiException: "OAuth client is unauthorized."
(siehe Screenshot2)(OAuthExample.cs, Zeile 84, UseClient Methode)
Nichts von dem was ich versucht habe hat mich der Lösung näher gebracht, daher wäre ich für jede Hilfe dankbar.
Screenshot exception:
-
Offizieller Kommentar
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 -
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;
}
}
} -
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
-
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
Bitte melden Sie sich an, um einen Kommentar zu hinterlassen.
Kommentare
7 Kommentare