避坑指南:Google OAuth2.0客户端授权请求报错

想要调用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商店邀请一下就可以了。

总结

官方文档有时候也不完全正确,即使说的都是对的,每个人的理解也不近相同,有问题还是要多靠搜索引擎,谷歌也好百度也罢,解决问题的效率远比自己埋头研究要高。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值