想要调用google cloud platform上各类google api接口,需要先完成OAuth2.0身份验证。
针对web应用,官方提供了文档:https://developers.google.com/identity/protocols/oauth2/web-server
坑1:jar包依赖不完整
本人使用的java实现,需要的类库官方也有介绍:https://developers.google.com/api-client-library/java
关键在于这里(方便阅读,把机翻也放上去):
maven导入的话是这样的
<project>
<dependencies>
<dependency>
<groupId>com.google.api-client</groupId>
<artifactId>google-api-client</artifactId>
<version>1.31.2</version>
</dependency>
</dependencies>
</project>
官方还给了java代码实例,这里以Admob api为例:https://github.com/googleads/googleads-admob-api-samples
直接复制到本地,还没运行就有问题了
这两个类没找到。。。
一开始以为是包的版本不对,其实原因是OAuth客户端库没导进来。当你相信这个包包含了所有需要的,你就上当了。
接着导入OAuth依赖包:
<dependency>
<groupId>com.google.oauth-client</groupId>
<artifactId>google-oauth-client-jetty</artifactId>
<version>1.31.5</version>
</dependency>
如此一来,照着官方文档就能成功编译程序。
坑2:Error 400: redirect_uri_mismatch
本地运行程序,正常应该弹出授权页面,实际却报了400
在前面的步骤中,有一步是在创建凭据后,下载client_secret.json文件。如果你在下载的时候没有配置“已获授权的重定向 URI”,下载下来的文件也不会有“redirect_uris:[]”这个配置。
但其实这个地址并不会根据配置而变化,在跟踪一下源码后发现是这个类的问题:LocalServerReceiver
这个类默认在空闲的端口随机获取一个,并加上/Callback路径,所以你会看到弹出的页面里的端口在重启后会不一样。
关键是你得让他和云平台上配置的uri一样啊,一直变是咋回事。
后来幸运的在这篇文章找到了答案:https://www.it1352.com/309920.html
不光是端口,域名也可以手动修改(需要保证该域名可访问且相应端口开放),结果是这样:
new LocalServerReceiver.Builder().setHost("example.google.com").setPort(80).build()
简单一点就用本地端口也是可以的,对应的云平台就应该是这样:
return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver.Builder().setPort(9089).build()).authorize("user");
再次运行,就能获取正常的授权页面了
坑3:调用api报错403
即使已经通过OAuth授权拿到token,想要访问特定用户的信息还需要得到他的授权
这个比较好解决,直接找对应用户,去google paly商店邀请一下就可以了。
总结
官方文档有时候也不完全正确,即使说的都是对的,每个人的理解也不近相同,有问题还是要多靠搜索引擎,谷歌也好百度也罢,解决问题的效率远比自己埋头研究要高。