我正在尝试在Google App Engine上创建一个API,可以通过身份验证的.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);
并且工作正常。
我有一个受
保护的servlet <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客户端对servlet进行身份验证。
我试过了
var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {credential.Token.AccessToken}");
httpClient.PutAsync("http://<my app>/servlet", content);
但是这会失败,因为put会将302重定向返回到以https://www.google.com/accounts/ServiceLogin开头的URL,这可能是.NET HTTP客户端所遵循的,因为它最终会以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获得的UserCredential)
然而,这会做同样的事情 - 发布重定向到谷歌/帐户/ ServiceLogin URl - 失败。
我尝试做的甚至可能吗? 当然,必须有一种方法让servlet能够通过API而不是从Web以编程方式对用户进行身份验证的用户进行身份验证吗?