【问题标题】:GAE Calling Servlet with user authenticated through gapi.auth.authorize用户通过 gapi.auth.authorize 进行身份验证的 GAE 调用 Servlet
【发布时间】:2015-06-03 18:38:31
【问题描述】:

我有一个 Google Cloud Endpoint,我通过 JavaScript 和 Google JavaScript 客户端库从 HTML 页面访问它。

我使用标准的 OAuth2.0 进行身份验证

gapi.auth.authorize({client_id: CLIENT_ID, scope: SCOPES, immediate: mode}, callback);

一切正常,我能够从底层数据存储区读取/写入数据。

在同一个 AppEngine 项目中,我有一个 servlet,它根据数据存储区中的数据生成 PDF。

我希望能够使用通过 api.auth.authorize() 方法进行身份验证的同一用户从我的 HTML 页面调用此 Servlet。

在servlet中,通过

获取用户
UserService userService = UserServiceFactory.getUserService();

并在数据存储中查询该用户的数据,然后生成显示该数据的 PDF。

我不知道如何使用 OAuth 身份验证用户的凭据调用此 url (servlet)。

你能帮帮我吗? 提前致谢!

请注意,几个月前有人问过同样的问题,但没有“完整”的答案:GAE User API with OAuth2

【问题讨论】:

  • 到目前为止,我还没有找到我的问题的任何答案,但我想分享一个解决我问题基础的业务需求的解决方案。因此,简而言之,要求是根据数据存储区中的某些数据生成 PDF,并链接到通过 Google JavaScript 客户端库通过 OAuth 进行身份验证的特定用户。我的解决方案基于云存储。我首先在 Cloud Storage 中为每个用户创建一个存储桶,并保护该存储桶以仅允许该用户访问。我在 Endpoint 中生成 PDF 并将其写入 ByteArrayOutputStream(名为“os”)。请参阅下一条评论。
  • 然后我通过 GcsFileOptions options = new GcsFileOptions.Builder().mimeType("application/pdf").build(); GcsOutputChannel outputChannel = gcsService.createOrReplace(gcsfileName, options); ByteBuffer buf = ByteBuffer.wrap(os.toByteArray()); outputChannel.write(buf); outputChannel.close(); 将其保存到云存储中,然后用户可以通过以下 URL https://storage.cloud.google.com/-bucketname-/-filename- 打开 PDF,前提是并且仅当他之前使用他的 Google 帐户进行了身份验证(特别是来自调用端点的页面)。我希望这会对某人有所帮助!

标签: google-app-engine google-oauth google-cloud-endpoints


【解决方案1】:

您应该查看bucket/object ACLs。当您的 API 端点获取 User 对象时,它可以使用the user's email 在生成的 PDF 上设置 ACL。这样,您只需使用其 URL 即可将 PDF 文件提供给用户。您还可以通过端点 API 调用检查用户是否确实被认证为允许访问请求的 PDF 的人(已存储数据存储条目,可能与对象并行),并在此生成 signed URL确认。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-18
    • 2016-04-16
    • 2012-11-23
    • 2017-07-03
    • 1970-01-01
    • 2014-05-28
    • 2011-04-10
    • 2012-08-28
    相关资源
    最近更新 更多