android google 登录流程及遇到的坑
最近在做Facebook 和google第三方登录,Facebook一气呵成,看着官方文档一步一步走,几乎没啥问题
Facebook登录 文档地址
https://developers.facebook.com/docs/facebook-login 点击打开链接
Facebook登录权限 文档地址
https://developers.facebook.com/docs/facebook-login/permissions 点击打开链接
这个权限文档有啥用呢,比如像获取该用户的email、年龄、性别等,就需要指定相关权限
Google登录 文档地址
https://developers.google.com/identity 点击打开链接
不管哪种第三方登录,国内国外的,都是通过他们的SDK返回用户相关信息,其中最重要的就是
userId和accessToken,一般的做法就是用这个accessToken再调用自己服务端的接口,我们的服务端
拿到这个accessToken后去验证以及返回用户资料信息给客户端,以后的步骤就和SDK无关了。
接下来看看Google登录的流程
当然前置步骤一定要有,就是审核之类APP之类的,那些照着文档走就可以了,这里主要讲坑,坑,坑
第一个坑,直接复制官方文档代码,获取不到 IdToken,正确代码如下:
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestEmail() .requestIdToken(GradApplication.getGrindrApplication().getString(R.string.server_client_id)) .build();
必须加上
.requestIdToken(GradApplication.getGrindrApplication().getString(R.string.server_client_id))
第二个坑,server_client_id从哪来?
https://console.developers.google.com/apis/credentials 点击打开链接
这就是获取的地方,选择相应的App后,选择Credentials(凭据)如图:
一般都有几个server_client_id,但是选哪个呢?
选择web client 对应的最新的那个就可以了
第三个坑,IdToken不是AccessToken,如果我们的后端需要token,就传给他AccessToken,这个坑我搞了很久,
太可恶了,下面看下如何获取AccessToken
官方文档地址:
https://developers.google.com/identity/sign-in/android/offline-access 点击打开链接
需要传几个参数来请求AccessToken,其实官网推荐让后端来请求,但是有时呢人在江湖身不由己,还得客户端请求,
注意一点:client_secret.json从哪来的呢?地址?
https://console.developers.google.com/apis/credentials 点击打开链接
前面贴那张图server_client_id旁边有个下载按钮,下载来后样子如下:
里面有请求需要的参数
第四个坑,https://www.googleapis.com/oauth2/v4/token 这个接口请求老是报错,说invalid_grant_type,
坑死宝宝了,最后知道原因了,请求的时候需要用Content-Type: application/x-www-form-urlencoded,
不能用Content-Type: application/json,
更可恶的是项目用的Retrofit,搞了半天终于设置好了,怎么设置的,如下
@POST("oauth2/v4/token") @FormUrlEncoded Call requestToken( @Field("client_id") String clientId, @Field("client_secret") String clientSecret, @Field("code") String code, @Field("redirect_uri") String redirectUri, @Field("grant_type") String grantType); @POST("oauth2/v4/token") @FormUrlEncoded Call requestTokenRefresh( @Field("refresh_token") String refreshToken, @Field("client_id") String clientId, @Field("client_secret") String clientSecret, @Field("grant_type") String grantType);
@FormUrlEncoded,需要在请求参数那里使用这个注解,这2个方法都是获取accessToken的,
一般用第一个方法就可以了,参数位置顺序没有关系的,redirect_uri参数传""就可以了,grant_type参数我传的"authorization_code",官方没说这个参数,应该不传也是可以的,可能是我们自己的业务需求吧
第二个方法需要refreshToken的。OK,到这里应该坑都平了,又可以愉快玩耍了。
更多相关文章
- Volley源码解析
- android网络打印 生成pdf
- Android(安卓)8.1 MTK6739平台客制化修改文档
- Android(安卓)Service待机/睡眠时运行
- Android(安卓)相对布局中的 代码中修改属性与布局文件的设置不同
- 裁判文书App(2020最新版) 逆向过程分析
- 基于Android的Word在线预览
- Android(安卓)视频录制 动态图
- android命令行编译生成apk(翻译官方文档)