我能够从 google admin SDK 的 user.list api 检索
thumbnailPhotoUrl
。 然而,每当我尝试渲染图像时,谷歌都会重定向到静态剪影图像。 通过 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 与多个谷歌帐户有关,所以我担心我无法依赖这种方法。 谁能帮我理解这里发生了什么?
根据我自己的经验,我发现如果 thumbnailPhotoUrl 在 URL 上是私有的,那么该照片不是公开的,即在域外不可见,也可能是用户尚未激活他们的 Google+ 个人资料,我对此相信无论如何都会公开他们的照片。
如果 URL 上有私有路径,最好避免使用 thumbnailPhotoUrl。我认为使用 Users.Photo API 将照片检索为网络安全的 Base64 数据,然后将其编码为内联 Base64 CSS 图像更可靠。
这是我通常使用的代码片段:
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;
}
}
这是我的 10 美分...
最近我一直致力于为 Angular 构建 G Suite 用户选择器,但遇到了同样的问题。尽管如此,我还是继续进行测试和研究,在其中一项测试中,我决定使用非管理员用户调用目录 api users list 端点。 (头爆炸🤯)令我惊讶的是,谷歌允许这种类型的请求,尽管它提供非超级管理员数据,但足以为用户获取私有缩略图网址。起初我认为这是一种无意的行为,如果你愿意的话,可以说是某种错误。就在那时我遇到了这个文档。
虽然用户帐户只能由管理员修改,但域中的任何用户都可以读取用户配置文件。非管理员用户可以使用等于domain_public 的viewType 参数发出users.get 或users.list 请求,以检索用户的公共配置文件。范围 https://www.googleapis.com/auth/admin.directory.user.readonly 非常适合此用例。
所以这是一种有意的行为。就在那时,它击中了我。检索用户数据时生成的私有 URL 仅供发出请求的用户使用。如果您将 URL 提供给其他用户,它将重定向到匿名剪影。
由此我可以得出结论,如果我需要检索用户列表并需要查看他们的照片的能力,我需要使用需要查看相应数据的用户的凭据来调用目录 api 端点。这符合我正在构建的 G Suite 用户选择器小部件的目的。