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帐户,因此我认为allUsers
和IAM
不是正确的方法。
我不确定云存储签名的URL是否正确。还有另一个问题是我已经在数据库中使用云存储对象公共URL存储了许多URL,如下所示:
ACL
当客户端(前端)尝试访问此数据时,如何为后端中的这些旧数据生成签名的url?
感谢您的建议。
答案 0 :(得分:2)
关于已签名的URL,它们在内部的工作原理大致相同,并以相同的方式或多或少地生成URL。 Cloud Storage具有内置的CDN,因此使用Cloud Storage签名的URL就足够了。
使用签名的URL,您无需将用户列入白名单,只需向他们发送URL,他们就可以在有限的时间内访问该URL。
在您的用例中,签名的URL可能存在生命周期有限,因此不是最佳选择,所以我建议您使用自己的逻辑(而不是IAM)让用户登录到您的应用,或者仅访问该应用无需登录(如果不是必须登录),然后让该应用通过服务帐户(IAM)处理用户对Cloud Storage对象的请求:
user
(非Google / Google)登录到app
(应用程序登录,而不是IAM)
user
请求由app
呈现的对象而没有内部数据(存储桶的路径等)
app
使用其自己的服务帐户(IAM)向Cloud Storage
Cloud Storage
将对象传递给应用,将应用传递给用户
使用此服务帐户解决方法,您仍然可以使用数据库中保存的URL。如果要使用签名的URL,则应不断修改数据库,这不是最佳选择。
您可以使用this从应用程序向Cloud Storage进行身份验证,将访问权限限制为仅对应用程序的服务帐户的访问。 您可以设置服务帐户implicitly或explicitly。