Проверка подлинности HTTP-сервлета AppEngine с помощью OAuth - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь создать API-интерфейс в Google App Engine, который может вызываться клиентом .NET с аутентификацией.

.NET-клиент аутентифицирует пользователя, используя

            UserCredential credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
              new ClientSecrets
              {
                  ClientId = "<client id>",
                  ClientSecret = "<client secret"
              },
              new[] { "email", "profile", "https://www.googleapis.com/auth/devstorage.read_write" }, "user", CancellationToken.None);

и это прекрасно работает.

У меня есть сервлет, который защищен

  <security-constraint>
    <web-resource-collection>
      <web-resource-name>servlet</web-resource-name>
      <url-pattern>/servlet/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
      <role-name>*</role-name>
    </auth-constraint>
  </security-constraint>

Так что он доступен только аутентифицированным пользователям, как я и хочу.

Я хочу, чтобы текущий пользователь мог использовать

User currentUser = UserServiceFactory.getUserService().getCurrentUser();

но я не могу заставить клиента .NET пройти аутентификацию на сервлете.

Я пытался

var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {credential.Token.AccessToken}");
httpClient.PutAsync("http://<my app>/servlet", content);

однако это завершается ошибкой, так как пут возвращает перенаправление 302 на URL, начинающийся с https://www.google.com/accounts/ServiceLogin...,, за которым, вероятно, следует HTTP-клиент .NET, так как в результате метод 405 не допускается.

Я тоже пробовал

 Google.Apis.Http.HttpClientFactory httpClientFactory = new HttpClientFactory();
 Google.Apis.Http.CreateHttpClientArgs httpClientArgs = new CreateHttpClientArgs();
 Google.Apis.Http.ConfigurableHttpClient httpClient = httpClientFactory.CreateHttpClient(new CreateHttpClientArgs());
 credential.Initialize(httpClient);

(учетные данные - это пользовательский сертификат, полученный выше от GoogleWebAuthorizationBroker.AuthorizeAsync)

однако, что делает то же самое - выдает редирект в google / accounts / ServiceLogin URl - что не получается.

Возможно ли то, что я пытаюсь сделать? Разумеется, у сервлета должен быть способ аутентификации пользователей, которые вызывают его программно через API, а не через Интернет?

1 Ответ

0 голосов
/ 11 июня 2018

Я предоставлю вам пару ссылок, которые могут оказаться полезными для вас:

  1. Существует три метода аутентификации в App Engine с использованием клиентской библиотеки Java. Найти их описание здесь .
  2. Найдите здесь a pom.xml образец с использованием Java Client Library и метода аутентификации Oauth.

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

...