Доступ к Oauth-токену - PullRequest
       57

Доступ к Oauth-токену

0 голосов
/ 01 марта 2019

Я хочу получить токен доступа, чтобы использовать его для извлечения электронной почты из Outlook, используя Microsoft Graph API.Моим приложением будет консольное приложение c #, которое будет запускаться автоматически через каждые 20 минут и получать электронную почту.

Я новичок в c #, а также в Microsoft Graph, это моя первая задача, связанная с этими технологиями.

Проблема:

Когда я попытался получить токен с помощью client_Credentials, я смог это сделать, но теперь, когда срок действия этого токена истек, я хочу получить новый токен, и если я пытаюсь сгенерировать новый токенон возвращает только просроченный.

Соответствующий код:

result = await context.AcquireTokenAsync(resourceUri, clientCredential);

Использование метода AcquireTokenSilentAsync возвращает как ошибку: "Не удалось получить токен в автоматическом режиме, так как токен не был найден в кэше. Вызовите методAcquireToken. "

Соответствующий код:

result = await authContext.AcquireTokenSilentAsync(resourceUri, clientId);

Мои вопросы:

  1. Является ли доступ к токену с использованием учетных данных клиента правильным способом удовлетворения моих потребностей?

  2. Я прочитал, что с помощью client_Credentials нам не нужен refresh_token, каждый раз, когда мы пытаемся подключиться, мы получаем новый токен.

  3. Как получать новый токен каждый раз, когда я хочу подключиться?

  4. Любые дополнительные предложения о том, как подойти к моей основной цели, которые не были заданы в вопросе,Будем очень рады.

Я прилагаю мой пример кода:

static async Task getAccessToken()
{
    authContext = new AuthenticationContext("https://login.microsoftonline.com/<tenantId>");
    try
    {
        result = await authContext.AcquireTokenSilentAsync(resourceUri, clientId);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
        try
        {

            result = await authContext.AcquireTokenAsync(resourceUri, clientCredential);

            Console.WriteLine("" + result.AccessToken+"\n\n");
        }
        catch (Exception e)
        {
            Console.WriteLine("\n AcquireTokenAsync failed\n");
            Console.WriteLine(""+e);
        }
    }
    if (result == null)
    {
        Console.WriteLine("Canceling attempt to get access token.\n");
        return;
    }
    Console.WriteLine(result.AccessToken);

}

1 Ответ

0 голосов
/ 01 марта 2019

Вы смешиваете два разных потока OAuth (код авторизации и учетные данные клиента).Вам нужно только позвонить AcquireTokenAsync с правильными учетными данными.Всякий раз, когда вам нужен новый токен (каждый токен живет около часа), вы повторно выполняете этот метод, чтобы получить новый токен:

static async Task<AuthenticationResult> getAccessToken()
{
    ClientCredential clientCredential = new ClientCredential("YOUR_APP_ID", "YOUR_APP_SECRET");
    AuthenticationContext authContext = new AuthenticationContext("https://login.microsoftonline.com/YOUR_TENANT_ID");
    AuthenticationResult result = null;

    try
    {
        result = await authContext.AcquireTokenAsync("https://graph.microsoft.com", clientCredential);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
    }

    if (result == null)
        Console.WriteLine("Canceling attempt to get access token.");
    else
        Console.WriteLine(result.AccessToken);

    return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...