最近产品在规划将我们android端的apk集成google的原生登录,就将自己的预研的成果分享下:
参考的google集成登录文档官网地址为:https://developers.google.com/identity/sign-in/android/start
https://developers.google.com/identity/sign-in/android/offline-access
1、基本流程
1、首先你得有一个google的账号
2、在google账号上创建apk,并获取到该apk的clientID,同时系统会生成一个web端的clientID和secret。
5、apk端集成时,这里需要注意一下,首先需要配置apk自己的clientID信息,同时在获取用户信息还需要配置后端server的clientId。
6、apk端获取到的是一个authCode,然后将其传递给后端,然后后端通过这个authCode去调用google获取token和用户信息。
这里将这个流程的图贴一下(参考好心人的图)
2、后端整合
在了解了基本流程后,这里我主要讲解一下自己后端的处理步骤。
这个流程图是我根据自己的理解画的流程图,其中主要的重点就是如果apk登录的authCode在后端调用google拿到了用户的信息后,我会将这个保存起来,主要的目的是为了避免每次用户重新进入apk都需要后端去请求google。(不知道这种做法对不对)
3、整合时遇到的坑
整合过程中,最烦人的就是google提供的文档中虽然有代码,但是很神奇的是,没有提供maven的依赖。所以当我复制了google的示例代码后,整了好久才找到没问题的jar包。(我用的maven),这里就将集成google登录需要用到的maven包依赖发一下吧。
<dependency>
<groupId>com.google.oauth-client</groupId>
<artifactId>google-oauth-client-java6</artifactId>
<version>1.30.4</version>
</dependency>
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-drive</artifactId>
</dependency>
<dependency>
<groupId>com.google.api-client</groupId>
<artifactId>google-api-client</artifactId>
<version>1.30.8</version>
</dependency>
<dependency>
<groupId>com.google.oauth-client</groupId>
<artifactId>google-oauth-client-jetty</artifactId>
<version>1.30.5</version>
</dependency>
应该只需要这些。顺便也把后端去请求google获取用户信息的代码也贴一下。(建议最好还是去找官网提供的)
import java.io.FileReader;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeTokenRequest;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
import com.google.api.client.googleapis.auth.oauth2.GoogleTokenResponse;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
public class GoogleLoginTest
{
public static void main(String[] args)
{
try
{
String CLIENT_SECRET_FILE = "client_secret.json";
String authCode = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
// Exchange auth code for access token
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(
JacksonFactory.getDefaultInstance(), new FileReader(CLIENT_SECRET_FILE));
GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(
new NetHttpTransport(), JacksonFactory.getDefaultInstance(),
"https://oauth2.googleapis.com/token", clientSecrets.getDetails().getClientId(),
clientSecrets.getDetails().getClientSecret(), authCode, "").execute();
String accessToken = tokenResponse.getAccessToken();
System.out.println("accessToken is " + accessToken);
// Get profile info from ID token
GoogleIdToken idToken = tokenResponse.parseIdToken();
System.out.println("id Token的值为" + idToken);
GoogleIdToken.Payload payload = idToken.getPayload();
System.out.println("payload中所有的信息为:" + payload.toString());
String userId = payload.getSubject(); // Use this value as a key to identify a user.
String email = payload.getEmail();
boolean emailVerified = Boolean.valueOf(payload.getEmailVerified());
String name = (String)payload.get("name");
String pictureUrl = (String)payload.get("picture");
String locale = (String)payload.get("locale");
String familyName = (String)payload.get("family_name");
String givenName = (String)payload.get("given_name");
System.out.println("userId为" + userId);
System.out.println("email为" + email);
System.out.println("name为" + name);
System.out.println("pictureUrl为" + pictureUrl);
System.out.println("locale为" + locale);
System.out.println("familyName为" + familyName);
System.out.println("givenName为" + givenName);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}