Я пытаюсь создать 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, а не через Интернет?