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(凭据)如图:

android google 登录流程及遇到的坑_第1张图片

一般都有几个server_client_id,但是选哪个呢?

选择web client 对应的最新的那个就可以了

 

第三个坑,IdToken不是AccessToken,如果我们的后端需要token,就传给他AccessToken,这个坑我搞了很久,

太可恶了,下面看下如何获取AccessToken

 

官方文档地址:

https://developers.google.com/identity/sign-in/android/offline-access      点击打开链接

android google 登录流程及遇到的坑_第2张图片

需要传几个参数来请求AccessToken,其实官网推荐让后端来请求,但是有时呢人在江湖身不由己,还得客户端请求,

注意一点:client_secret.json从哪来的呢?地址?

https://console.developers.google.com/apis/credentials           点击打开链接

前面贴那张图server_client_id旁边有个下载按钮,下载来后样子如下:

android google 登录流程及遇到的坑_第3张图片

里面有请求需要的参数

 

第四个坑,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,到这里应该坑都平了,又可以愉快玩耍了。

 

 

你可能感兴趣的:(Android)