使用OAuth

时间:2018-05-17 12:39:08

标签: google-app-engine google-oauth google-oauth2

我正在尝试在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以编程方式对用户进行身份验证的用户进行身份验证吗?

1 个答案:

答案 0 :(得分:0)

我会为您提供一些可能对您有用的链接:

  1. 使用Java客户端库在App Engine中进行身份验证有三种方法。找到他们的描述here
  2. 使用Java客户端库和Oauth身份验证方法查找herepom.xml示例。
  3. 我希望你能在那里找到答案。我不想更具体,因为我不太了解你正在使用的管道。