前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >App Google一键登录

App Google一键登录

原创
作者头像
Java king
发布2023-02-23 11:05:07
4.5K1
发布2023-02-23 11:05:07
举报
文章被收录于专栏:后端Java后端Java

我要做的事,不过是伸手去收割旁人替我播种的庄稼而已。——歌德

概述

其实所有的第三方登录都是基于OAuth协议的,大多数平台都支持OAuth2.0,只有Twitter的是基于OAuth1.0来做的。

到Google官网注册开发者账号,创建凭据(就是应用)

官网链接:https://developers.google.com/

创建应用:https://console.developers.google.com/apis/credentials

根据需要创建不同的应用,比如我做的功能是app Google一键登录,我就需要申请安卓和ios

创建完应用咱们需要拿到客户端 ID 也就是clientId

这样咱们前期的准备工作就已经完事了

代码实现

Google文档:https://developers.google.com/identity?hl=zh-cn

点击登录(使用一键登录)

Google的文档写的还是比较详细的,推荐大家还是先把文档看明白。

前提条件

Android 版 Google 登录服务有以下要求:

  • 一台搭载 Android 4.4 或更高版本的兼容 Android 设备,并且包含 Google Play 商店或包含 AVD 的模拟器,该 AVD 搭载基于 Android 4.2.2 或更高版本且具有 Google Play 服务 15.0.0 或更高版本的 Google API 平台。
  • 最新版本的 Android SDK,包括 SDK 工具组件。 可以通过 Android Studio 中的 Android SDK 管理器获取此 SDK。
  • 配置为针对 Android 4.4 (KitKat) 或更高版本进行编译的项目。

前期安卓和IOS引入响应的SDK之后,前端就可以获取到ID_TOKEN

代码语言:javascript
复制
//大致返回的数据结构就是这个样子的
{
    "msg":"无",
    "data":{
        "userId":"",
        "hasImage":"1",
        "photoUrl":"",
        "authCode":"0",
        "refreshToken":"",
        "fullName":"creda go",
        "familyName":"go",
        "givenName":"",
        "accessToken":"",
        "idToken":"eyJhbGciOiJSUzI1NiIsImtpZCI6ImQyNWY4ZGJjZjk3ZGM3ZWM0MDFmMDE3MWZiNmU2YmRhOWVkOWU3OTIiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJhenAiOiI1NTQ2NjQ0MDE3LW5ia2lndDE0ZTU0YmtmdWMzZHFtZjdrYmEyOG4wZTBvLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwiYXVkIjoiNTU0NjY0NDAxNy1uYmtpZ3QxNGU1NGJrZnVjM2RxbWY3a2JhMjhuMGUwby5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsInN1YiI6IjEwODI3MzgyNzE3NjgxNjYzMjA2NiIsImVtYWlsIjoiZ29jcmVkYTFAZ21haWwuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsImF0X2hh125323145121313231c2giOiJndTFPQ0haTFJNQ19HSVEwb1diMDNBIiwibm9uY2UiOiI1ckZqd0RVRmxCZGctanNvd0tWdFBvMHd5QkEwTWR2Zmd3ekEwMWQ0VmJvIiwibmFtZSI6ImNyZWRhIGdvIiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hL0FFZEZUcDUxc0Y2bGxRRFk2aklGSDdlNkpOeFNrRlF2akZUc1VERjhqc0hIPXM5Ni1jIiwiZ2l2ZW5fbmFtZSI6ImNyZWRhIiwiZmFtaWx5X25hbWUiOiJnbyIsImxvY2FsZSI6InpoLUNOIiwiaWF0IjoxNjc3MTE0NjQ3LCJleHAiOjE2NzcxMTgyNDd9.ESddr2S7pf5K1mTp9_ND9jDTFOv7_HzLP8X5BOqQNUWprq_UAEN00GFL-R5YzQpdiHNWJrovmKFqF5Q_50ZrCsUervmtyJJWS65rfP4eRBHBQ0lTBlVGRtMeiMeZ5XYx26oJ9JzU3JwwZwy1XfzlM3JsxU8Bq-Kwok553UDepBp1GHnjCG97ZWG4lN_X1PJ_YoJYgz6LW2ajck0ntP7flV0fh1k-Nu-rJaRbiaxY7T4Z6ACqZk5AOaQ-LQ55G_UZRFtwhgxwJrJWzf6sseYwd3ixnCETUvD6ecVqqdtLnI0w9PJKnyGJmMWfA1IXiava81tHHvI4DpZlCW-djmYwmA",
        "email":""
    },
    "errorCode":"0"
}

获取到这些,前端的任务就已经完成了,后面就是后端的代码实现了。

后端开发文档:https://developers.google.com/identity/sign-in/android/backend-auth?hl=zh-cn

如果您将 Google 登录与与后端服务器通信的应用或网站搭配使用,则可能需要识别服务器上当前已登录的用户。为此,请在用户成功登录后,使用 HTTPS 将该用户的 ID 令牌发送到您的服务器。然后,在服务器上验证 ID 令牌的完整性,并使用该令牌中包含的用户信息来建立会话或创建新帐号。

警告:请勿在后端服务器上接受普通用户 ID(例如您可以使用 GoogleSignInAccount.getId() method 获取的 ID)。经过修改的客户端应用可以将任意用户 ID 发送到您的服务器以模拟用户,因此您必须改用可验证的 ID 令牌来安全地获取已登录用户的 User-ID。

在发送id_token之前都是由安卓进行实现的,注意这里别有误区,后端这边只需要负责验证 ID 令牌的完整性

所以文档可以直接从这里往下看

废话少说,直接上代码

首先引入需要的依赖

代码语言:javascript
复制
    <!--Google API -->
    <dependency>
      <groupId>com.google.api-client</groupId>
      <artifactId>google-api-client</artifactId>
      <version>1.33.0</version>
    </dependency>
​
    <dependency>
      <groupId>com.google.http-client</groupId>
      <artifactId>google-http-client-jackson2</artifactId>
      <version>1.42.3</version>
    </dependency>
代码语言:javascript
复制
      GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(new NetHttpTransport(), JacksonFactory.getDefaultInstance())
        //这里传入刚才前期准备的客户端ID,这里可以是个数组,因为咱们安卓和IOS是分开的。
        .setAudience(Arrays.asList(ThirdConfig.googleAndroidClientId, ThirdConfig.googleIosClientId)).build();
      // TODO:验证前端传入的idToken
      GoogleIdToken googleIdToken = verifier.verify(sysGoogleDto.getIdToken());
      if (googleIdToken != null) {
        GoogleIdToken.Payload payload = googleIdToken.getPayload();
        String googleEmail = 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");
      }

获取到Google凭证之后大家就可以写自己的登录注册逻辑了。

创建帐号或会话

验证令牌后,请检查用户是否已存在于您的用户数据库中。如果是这样,请为用户建立经过身份验证的会话。如果用户尚不在您的用户数据库中,请根据 ID 令牌载荷中的信息创建新的用户记录,并为用户建立会话。当您在应用中检测到新创建的用户时,可以提示用户输入所需的任何其他个人资料信息。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 前提条件
  • 创建帐号或会话
相关产品与服务
多因子身份认证
多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档