最近在做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,到这里应该坑都平了,又可以愉快玩耍了。

 

 

更多相关文章

  1. Volley源码解析
  2. android网络打印 生成pdf
  3. Android(安卓)8.1 MTK6739平台客制化修改文档
  4. Android(安卓)Service待机/睡眠时运行
  5. Android(安卓)相对布局中的 代码中修改属性与布局文件的设置不同
  6. 裁判文书App(2020最新版) 逆向过程分析
  7. 基于Android的Word在线预览
  8. Android(安卓)视频录制 动态图
  9. android命令行编译生成apk(翻译官方文档)

随机推荐

  1. Android vector矢量图应用实例
  2. android事件处理机制
  3. Android NDK r4 windows 环境中的安装
  4. Android 系统架构了解学习
  5. android recovery mode
  6. IDEA搭建Android wear开发环境,Android we
  7. Android 创建与解析XML(一)—— 概述
  8. Android最简单播放GIF动画方法
  9. android内存泄露分析
  10. Android(Java):adb与linux命令