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