关于自有系统集成google原生登录的小结

最近产品在规划将我们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();
        }
    }

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值