检索 Google 用户照片
Posted
技术标签:
【中文标题】检索 Google 用户照片【英文标题】:Retrieving Google User Photo 【发布时间】:2014-10-17 12:09:30 【问题描述】:我能够从 google admin SDK 的 user.list api 中检索 thumbnailPhotoUrl
。但是,每当我尝试渲染图像时,Google 都会重定向到静态剪影图像。通过 API 检索到的 URL 如下所示
https://plus.google.com/_/focus/photos/private/AIbEiAIA....
如前所述,这最终会被重定向到:
https://ssl.gstatic.com/s2/profiles/images/silhouette200.png
但是,通过一些逆向工程,我可以通过将 /u/1/ 添加到 URL 路径的开头来查看照片,如下所示:
https://plus.google.com/u/1/_/focus/photos/private/AIbEiAIA...
根据我的研究,/u/1 与多个谷歌帐户有关,所以恐怕我无法依赖这种方法。谁能帮我理解这里发生了什么?
【问题讨论】:
【参考方案1】:这是我的 10 美分...
最近我一直致力于为 Angular 构建 G Suite 用户选择器,但遇到了同样的问题。尽管如此,我一直在测试和研究,在我的一项测试中,我决定使用非管理员用户调用目录 api users list endpoint。 (头爆炸?)令我惊讶的是,谷歌允许这种类型的请求,虽然它提供非超级管理员数据但足以为用户获取私人缩略图 url。起初我认为这是一种无意的行为,如果你愿意的话,是某种错误。那是我遇到this documentation的时候。
虽然用户帐户只能由管理员修改,但域中的任何用户都可以读取用户配置文件。非管理员用户可以使用 viewType 参数等于 domain_public 发出 users.get 或 users.list 请求以检索用户的公共配置文件。范围 https://www.googleapis.com/auth/admin.directory.user.readonly 非常适合此用例。
所以这是一种预期的行为。那是它击中我的时候。检索用户数据时生成的私有 url 仅供请求用户使用。如果您将 url 提供给其他用户,它将重定向到匿名剪影。
由此我可以得出结论,如果我需要检索用户列表并需要能够查看他们的照片,我需要使用需要查看相应数据的用户的凭据调用目录 api 端点.这符合我正在构建的 G Suite 用户选择器小部件的目的。
【讨论】:
只是有同样的问题,有趣的解决方案,但似乎要求非管理员用户拥有 admin.directory 读取范围,否则请求为 403。 @DavidThomas 确实,但您应该授予只读范围以确保其安全。 是的,我为示例用户授予了该范围,但仍然无法请求照片,只能获得私人照片 URL。我最终使用其他用户照片 api 来获取所需的数据 developers.google.com/admin-sdk/directory/v1/reference/users/…【参考方案2】:根据我自己的经验,我发现如果 thumbnailPhotoUrl 在 URL 上是私有的,那么照片不是公开的,即在域外无法查看,也可能是用户没有激活了他们的 Google+ 个人资料,我相信无论如何都会公开他们的照片。
如果 URL 上有私有路径,最好避免使用 thumbnailPhotoUrl。我认为使用Users.Photo API 将照片检索为 Web 安全的 base64 数据然后将其编码为内联 base64 CSS 图像更可靠。
这是我常用的sn-p代码:
import com.google.common.io.BaseEncoding;
import com.google.api.services.admin.directory.model.User;
import com.google.api.services.admin.directory.model.UserPhoto;
public class PhotoUtils
public void loadPhoto()
// if the user have not signed up for Google+ yet then their thumbnail is private
String thumbnailUrl = user.getThumbnailPhotoUrl();
String photoData = "";
if((thumbnailUrl != null) && (thumbnailUrl.indexOf("private") > -1))
UserPhoto photo = getUserPhoto(user.getId());
if(photo != null)
photoData = getBase64CssImage(photo.getPhotoData(), photo.getMimeType());
public static String getBase64CssImage(String urlSafeBase64Data, String mimeType)
urlSafeBase64Data = new String(BaseEncoding.base64().encode(
BaseEncoding.base64Url().decode(urlSafeBase64Data)));
return "data:" + mimeType + ";base64," + urlSafeBase64Data;
public UserPhoto getUserPhoto(String userId) throws IOException
UserPhoto photo = null;
try
photo = this.getClient().users().photos().get(userId).execute();
catch(GoogleJsonResponseException e)
if(e.getMessage().indexOf(NOT_FOUND) == 0)
log.warning("No photo is found for user: " + userId);
else
throw e;
return photo;
【讨论】:
以上是关于检索 Google 用户照片的主要内容,如果未能解决你的问题,请参考以下文章