使用OAuth2Authenticator调用Google Drive API后e.Account为null如何解决
Google Drive OAuth2 授权后返回Account为null问题修复
你判断的方向完全正确,故障核心是Google授权完成后的回调没有被你的应用正确拦截并传递给OAuth组件,按以下步骤逐一排查即可解决:
- 首先校验Android清单文件的拦截配置
你需要给接收授权回调的Activity配置IntentFilter,配置的scheme、host必须和代码里传入的重定向URI完全字符级匹配,多一个斜杠、错一个字符都会拦截失败,参考配置:
不要随意加path配置,你当前用的重定向格式里,oauth2redirect是host不是路径,写错位置直接拦截失效。<activity android:name="你的应用命名空间.RedirectInterceptorActivity"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <!-- 和代码中new Uri("com.***.myapp:/oauth2redirect")完全对应 --> <data android:scheme="com.***.myapp" android:host="oauth2redirect" /> </intent-filter> </activity> - 修正OAuth组件初始化逻辑
你当前传空字符串作为clientSecret是符合移动端OAuth规范的,但要注意两个容易踩的坑:- Google Cloud控制台创建的OAuth客户端ID必须选择Android类型,绝对不能用Web端、桌面端的客户端ID,同时要把你当前安装包的debug、release签名SHA1、包名完整添加到控制台配置里,签名不匹配Google不会正常回调
- 先把
isUsingNativeUI: true改成false测试,安卓12以上部分机型的系统定制WebView对原生授权UI兼容有问题,会导致回调丢失,改用Chrome Custom Tab流程稳定性高很多
- 补全回调传递的代码逻辑
90%的同类问题都是漏了这一步:你在拦截回调的Activity里,必须把收到的Intent数据传给之前发起授权的同一个OAuth2Authenticator实例,绝对不能在这里new新的实例,参考代码:
如果你每次发起授权都新建auth实例、或者回调的时候找不到之前发起请求的实例,Completed事件永远不会触发正确结果。protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); // 获取你之前发起授权时保存的auth全局实例,不要新建 OAuth2Authenticator auth = AuthManager.StoredAuthInstance; // 把回调数据传给auth组件解析 auth.OnPageLoading(Intent.Data); Finish(); } - 校验三处重定向地址完全一致
代码里初始化auth传入的重定向地址、Manifest里IntentFilter配置的地址、Google Cloud控制台里配置的授权回调地址,三个地方必须完全一模一样,你当前写的com.***.myapp:/oauth2redirect是单斜杠格式,不要写成常见的双斜杠com.***.myapp://oauth2redirect,格式不匹配会直接拦截失败。
快速定位技巧:授权完成跳回应用时打日志看Intent.Data的值,如果这个值为null,说明Manifest拦截配置错了;如果Intent.Data有授权码参数但Completed事件还是报未认证,说明你没正确调用OnPageLoading传值,或者用了错误的auth实例。
内容的提问来源于stack exchange,提问作者Maxime V
相关产品推荐
相关产品推荐

