Cloud CDN签署的网址V.S.云存储签名网址?

时间:2019-07-08 09:40:29

标签: google-cloud-platform google-cloud-storage

Cloud Storage签名的网址文档:https://cloud.google.com/storage/docs/access-control/signed-urls

Cloud CDN签名的url文档:https://cloud.google.com/cdn/docs/using-signed-urls

它们之间有什么区别?我很困惑应该使用哪一个。

这是我的情况:

我想将我的存储桶和对象公开,不公开,这意味着我将从权限中删除public class FeedbackListAdapter extends RecyclerView.Adapter<FeedbackListAdapter.ViewHolder> { private final ArrayList<Feedback> feedbacks; private View.OnClickListener onItemClickListener; private View.OnLongClickListener onItemLongClickListener; private final Context context; public FeedbackListAdapter(ArrayList<Feedback> feedbacks, Context context) { this.feedbacks = feedbacks; this.context = context; } public void setItemClickListener(View.OnClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } public void setOnItemLongClickListener(View.OnLongClickListener onItemLongClickListener){ this.onItemLongClickListener = onItemLongClickListener; } public class ViewHolder extends RecyclerView.ViewHolder{ final TextView feedback, created, updated; final LinearLayout mainLayout; ViewHolder(View iv) { super(iv); /* * Associate layout elements to Java declarations * */ mainLayout = iv.findViewById(R.id.main_layout); feedback = iv.findViewById(R.id.feedback); created = iv.findViewById(R.id.created_string); updated = iv.findViewById(R.id.updated_string); } } @Override public int getItemCount() { return feedbacks.size(); } @Override @NonNull public FeedbackListAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_feedback_table_row, parent, false); return new FeedbackListAdapter.ViewHolder(view); } @Override public void onBindViewHolder(final @NonNull FeedbackListAdapter.ViewHolder holder, final int position) { /* * Bind data to layout * */ try{ Feedback feedback = feedbacks.get(position); holder.feedback.setText(feedback.getContent()); holder.created.setText(feedback.getCreated()); holder.updated.setText(feedback.getUpdated()); holder.mainLayout.setOnClickListener(this.onItemClickListener); holder.mainLayout.setOnLongClickListener(this.onItemLongClickListener); holder.mainLayout.setTag(feedback.getDbID()); TypedValue outValue = new TypedValue(); context.getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true); holder.mainLayout.setBackgroundResource(outValue.resourceId); }catch(IndexOutOfBoundsException e){ e.printStackTrace(); } } 成员。

我正在寻找一种方法,使我的应用程序用户可以通过某种身份验证来访问对象(图像,媒体)。否则,互联网上的所有用户都将访问我的存储桶和对象。用户不需要拥有Google帐户,因此我认为allUsersIAM不是正确的方法。

我不确定云存储签名的URL是否正确。还有另一个问题是我已经在数据库中使用云存储对象公共URL存储了许多URL,如下所示:

ACL

当客户端(前端)尝试访问此数据时,如何为后端中的这些旧数据生成签名的url?

感谢您的建议。

1 个答案:

答案 0 :(得分:2)

关于已签名的URL,它们在内部的工作原理大致相同,并以相同的方式或多或少地生成URL。 Cloud Storage具有内置的CDN,因此使用Cloud Storage签名的URL就足够了。

使用签名的URL,您无需将用户列入白名单,只需向他们发送URL,他们就可以在有限的时间内访问该URL。

在您的用例中,签名的URL可能存在生命周期有限,因此不是最佳选择,所以我建议您使用自己的逻辑(而不是IAM)让用户登录到您的应用,或者仅访问该应用无需登录(如果不是必须登录),然后让该应用通过服务帐户(IAM)处理用户对Cloud Storage对象的请求:

  1. user(非Google / Google)登录到app(应用程序登录,而不是IAM)

  2. user请求由app呈现的对象而没有内部数据(存储桶的路径等)

  3. app使用其自己的服务帐户(IAM)向Cloud Storage

  4. 请求对象
  5. Cloud Storage将对象传递给应用,将应用传递给用户

使用此服务帐户解决方法,您仍然可以使用数据库中保存的URL。如果要使用签名的URL,则应不断修改数据库,这不是最佳选择。

您可以使用this从应用程序向Cloud Storage进行身份验证,将访问权限限制为仅对应用程序的服务帐户的访问。 您可以设置服务帐户implicitlyexplicitly