前言

这篇文章包含了google登录授权从API创建、到使用Java代码完成登录的一个完整demo。

主要为了实现google关联用户的服务,如google merchant center等。

如果仅仅需要使用google邮箱登录,建议由前端实现google登录:

1,国内网络和google服务是不通的,国内服务器需要解决网络问题,如果由前端实现google登录用户解决网络问题即可;

2,前端实现更简单

目录

了解Auth2.0

创建API服务

使用API


了解Auth2.0

google相关文档:https://developers.google.com/identity/protocols/oauth2

google账号授权登录用的就是Auth2.0协议。

举一个例子了解Auth2.0的设计模式。

  • 令牌 Token

你在公司某个周五的下午点了一杯奶茶,楼下有个需要密码才能进来的门禁,你当然不会把密码告诉配送小哥,你告诉配送小哥在门禁App登记一下访客登记卡,你同意一系列访客管理须知后,发短信验证码给他,小哥输入验证码并获得访客卡顺利进来了;

  • 授权域 Scopes

配送小哥进来后拿这访卡刷电梯,有两个电梯都能上去你所在的楼层,电梯A能到达公司的办公场所,电梯B能到达用餐室,但小哥只能使用电梯B,因为你在用餐室等着了,没必要去到办公室打扰到其他同事;

  • 令牌过期

周六的时候你又在公司同一家店点了一杯奶茶,奶茶送到时发现发现之前申请的访客卡是临时的,要重新登记,只是你发送验证码的时候不再需要经过一系列访客管理须知,因为门禁app上已经有你对配送小哥的授权记录了;

  • 离线令牌 Refresh Token

点了两次的你觉得这家店奶茶很好喝,于是你在这家店开了会员。但有时你在开会无法及时给配送小哥访客卡验证码,于是你让店家登记一个会员卡,凭这个会员卡可以直接要到访客卡,无需授权;

  • 撤销令牌

有一天你在网上冲浪看到拓海的近照,你决定戒奶,于是在门禁app上把店家的访客卡和会员卡给取消了。

创建API服务

了解完auth2.0之后,开始正式使用google的授权登录。

现在演示的是一个测试项目,google对测试项目没有强校验,所以下面信息填写可以随意。确认可行性后创建生产项目时需要进行认证。

之外,你可能需要在YouTube上传一个使用录屏视频给审核员,来演示你是利用谷歌api来完成哪一些事情的,演示视频项目内容需要为英文,如果你的项目不是英文可以在演示的时候翻译成英文

用谷歌账号注册API

https://console.cloud.google.com/

用谷歌账号登录后创建一个【test】项目

创建完项目【test】,来到控制台

题外话:如果你想使用google某些功能,可以到Api库添加Api;例如谷歌翻译,搜索并启用。(ps:google翻译api是收费的,需要一个结算管理账号)

配置同意屏

同意屏幕:用户在你的应用登录时,google展示给用户的信息,包括网站域名与logo、隐私政策

应用网域

包含四部分信息,网站域名、网站首页、隐私政策和服务条款。

范围

即授权域。这也是会在用户同意屏幕展示的。

我们需要保存邮箱账号,所以只使用/auth/userinfo/email这个授权范围

创建凭据

选择OAuth客户端ID

选择web应用,并配置授权登录后的url(url需要是https协议,尽管只是个测试项目)

创建后就获得客户端id和秘钥

使用API服务

引入maven

<dependency><groupId>com.google.auth</groupId><artifactId>google-auth-library-oauth2-http</artifactId><version>0.22.2</version>
</dependency>

配置类

import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.zz.saas.shoplus.portal.bean.GoogleAuthorization;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/*** google登录授权配置*/
@Configuration
@Slf4j
public class GoogleAuthorizationConfig {private static final String clientId = "your client id";private static final  String clientSecret = "your client secret";private static final  String applicationName = "your application name";private static final  String redirectUrl = "https://test.com/google-login";@Bean(name = "googleAuthorization")public GoogleAuthorization googleFeed() {GoogleClientSecrets clientSecrets = null;try {GoogleClientSecrets.Details details = new GoogleClientSecrets.Details();details.setClientId(clientId);details.setClientSecret(clientSecret);clientSecrets = new GoogleClientSecrets();clientSecrets.setInstalled(details);} catch (Exception e) {log.error("authorization configuration error:{}", e.getMessage());}// 构建beanreturn GoogleAuthorization.builder().googleClientSecrets(clientSecrets).applicationName(applicationName).redirectUrl(redirectUrl).build();}
}
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Collections;
import java.util.List;/*** google授权*/
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Data
public class GoogleAuthorization {// 应用名private String applicationName;// 重定向路径private String redirectUrl;// 应用凭证private GoogleClientSecrets googleClientSecrets;// 授权域private final static List<String> scopes = Collections.singletonList("https://www.googleapis.com/auth/userinfo.email");public List<String> getScopes(){return scopes;}
}

获得发起登录请求链接

// 导包信息
import com.google.api.client.auth.oauth2.BearerToken;
import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.googleapis.auth.oauth2.*;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;@Autowired
private GoogleAuthorizationService googleAuthorizationService;public String authorizingUrl() throws GeneralSecurityException, IOException {HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();// 创建验证流程对象GoogleAuthorizationCodeFlow googleAuthorizationCodeFlow = new GoogleAuthorizationCodeFlow.Builder(httpTransport, jsonFactory, googleAuthorization.getGoogleClientSecrets(), googleAuthorization.getScopes())// AccessType为离线offline,才能获得Refresh Token.setAccessType("offline").build();if (googleAuthorizationCodeFlow != null) {// 返回跳转登录请求return googleAuthorizationCodeFlow.newAuthorizationUrl().setRedirectUri(googleAuthorization.getRedirectUrl()).build();}return null;
}

调用方法authorizingUrl,得到一个跳转的url:

https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=YourClientId&redirect_uri=https://test.com/google-login&response_type=code&scope=https://www.googleapis.com/auth/userinfo.email

放到postman看看参数

在浏览器访问这个url,跳转到同意屏幕,可以看到之前创建api的应用信息

登录一个谷歌账号,授权之后462,因为域名是随便填的,但是主要是获得重定向后的URL

重定向URL填充了一个授权码code,接下来就可以拿这个授权码去授权了

使用授权码授权

用授权码获得登录token

// 导包信息
import com.google.api.client.auth.oauth2.BearerToken;
import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.googleapis.auth.oauth2.*;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;public void authorizing(String authorizationCode) throws GeneralSecurityException, IOException {// 创建请求凭证HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();GoogleAuthorizationCodeFlow googleAuthorizationCodeFlow = new GoogleAuthorizationCodeFlow.Builder(httpTransport, jsonFactory, googleAuthorization.getGoogleClientSecrets(), googleAuthorization.getScopes())// AccessType为离线offline,才能获得Refresh Token.setAccessType("offline").build();GoogleAuthorizationCodeTokenRequest tokenRequest = googleAuthorizationCodeFlow.newTokenRequest(authorizationCode);tokenRequest.setRedirectUri(googleAuthorization.getRedirectUrl());// 发起授权请求,获得Token和Refresh TokenGoogleTokenResponse tokenResponse = tokenRequest.execute();String token = tokenResponse.getAccessToken();String refreshToken = tokenResponse.getRefreshToken();// 获得emailString email = null;if (StringUtils.isNotBlank(tokenResponse.getIdToken())) {GoogleIdTokenVerifier idTokenVerifier = new GoogleIdTokenVerifier.Builder(googleAuthorizationCodeFlow.getTransport(), googleAuthorizationCodeFlow.getJsonFactory()).build();idTokenVerifier.verify(tokenResponse.getIdToken());GoogleIdToken googleIdToken = idTokenVerifier.verify(tokenResponse.getIdToken());if (googleIdToken != null && googleIdToken.getPayload() != null) {email = googleIdToken.getPayload().getEmail();}}// todo 保留账号token、refreshToken、email信息
}

Refresh Token

token的有效期为1小时,token过期之后让用户跳转到登录页重新登录就可以了;

但如果需要离线使用谷歌api时,就可以使用Refresh Token

public String refreshToken(String refreshToken) throws IOException {String token = null;// 创建刷新请求对象GoogleRefreshTokenRequest googleRefreshTokenRequest = new GoogleRefreshTokenRequest(new NetHttpTransport(),JacksonFactory.getDefaultInstance(),refreshToken,googleAuthorization.getGoogleClientSecrets().getDetails().getClientId(),googleAuthorization.getGoogleClientSecrets().getDetails().getClientSecret());// 发起刷新请求GoogleTokenResponse googleTokenResponse = googleRefreshTokenRequest.execute();if (googleTokenResponse != null && StringUtils.isNotBlank(googleTokenResponse.getAccessToken())) {token = googleTokenResponse.getAccessToken();}return null;
}

Google登录授权详细过程相关推荐

  1. centos7安装或升级Firefox、安装Google chrome浏览器详细过程及设置桌面快捷方式

    目录 一.centos7火狐浏览器安装 1. 从 Firefox官网的"更多系统和语言下载"最新版本.​​​​ 2.进入存放下载文件(Firefox-latest-x86_64.t ...

  2. 康乐linux登录后台,解决LuManager自己的路zijidelu忘记后台登录密码详细过程

    对于刚使用上以LuManager自己的路(zijidelu)集成环境搭建的Linux系统服务器网站的新手站长来说忘记了后台登录密码真是一件糟糕的事情,虽然这一时不影响你网站的正常运行,但数据安全始终是 ...

  3. 使用vue编写登录页面详细过程

    首先,创建项目login vue create login cnpm install elementui vue-router vuex axios 结构如下 具体操作过程 在main.js中写入: ...

  4. centos7安装或升级Google chrome、安装Firefox浏览器详细过程及设置桌面快捷方式

    目录 背景: 一.centos7安装谷歌浏览器 1.Google chrome安装包下载 2.命令行安装 3.下载并安装字体所需依赖包 3.1.安装libvulkan.so.1()(64bit) 3. ...

  5. 使用Xamarin.Android中的Google登录OAuth 2.0对用户进行身份验证

    什么是用户认证? (What is User Authentication?) There is a user base associated with every app that is avail ...

  6. HBase 1.2.6 完全分布式集群安装部署详细过程

    2019独角兽企业重金招聘Python工程师标准>>> Apache HBase 是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,是NoSQL数据库,基于Google Big ...

  7. 网站渗透测试原理及详细过程

    渗透测试实战 site:baidu.com 渗透测试思路 site:baidu.com 带你入门渗透测试的5个项目:https://www.jianshu.com/p/5b82e42ae346 渗透测 ...

  8. 将 Shiro 作为应用的权限基础 三:基于注解实现的授权认证过程

    授权即访问控制,它将判断用户在应用程序中对资源是否拥有相应的访问权限. 如,判断一个用户有查看页面的权限,编辑数据的权限,拥有某一按钮的权限等等. 一.用户权限模型 为实现一个较为灵活的用户权限数据模 ...

  9. Android平台以WebView方式集成H5+SDK和支付宝登录授权插件开发思路总结

    首先附上Demo地址,大家可以去GitHub上面下载https://github.com/GitLGH/AlipayDemo 一:思路总结 蚂蚁金融开发平台上面对于支付宝登录授权部分使用的原生andr ...

最新文章

  1. Qt5布局管理(2)
  2. Windows7_x64下编译64位ffmpeg
  3. 华为交换机的配置及:access、trunk、hybird端口详解
  4. 充电网完成数千万元Pre-B轮融资,将会聚焦新能源乘用车市场
  5. Linux报错:Syntax error: ( unexpected解决办法(转)
  6. C++ 拷贝构造函数的使用场景
  7. ASP.Net数据库连接字符串
  8. 看ct片子的软件_X光、CT、核磁、B超的辐射到底对孩子有多大影响?
  9. 定期存款可以提前取出来吗_如果银行存款利率涨了,定期存款有必要取出再存吗?...
  10. 如何设计数据库(四)
  11. 京东程序员回应“被猝死”;淘宝特价版已提交微信小程序;苹果 M1 单核性能勇超 Intel 11 代 i7|极客头条...
  12. oralce 存储过程、函数和触发器
  13. 转载:互联网盈利模式
  14. Hdu 1026 Ignatius and the Princess I
  15. tableau参数_Tableau-参数的设置方法
  16. WPF教程二:理解WPF的布局系统和常用的Panel布局
  17. 基于CAA的CATIA二次开发环境搭建全过程(亲测可用)
  18. E4A易安卓Apost提交文本合并编码相关
  19. 3d max材质贴图
  20. CSS3硬件加速 - GPU加速

热门文章

  1. 使用uniapp时候根据设计图得出标准长宽比
  2. Android音视频开发;斗鱼直播实现
  3. 关于\x开头的字符串编码转换中文解决方法
  4. Unity URP 手撸一个自己的PBR材质
  5. 如何将GMS功能移植到Android系统中
  6. 百度网盘离线下载分析及实现
  7. 服务器销售怎么打开渠道,如何打开销售渠道?
  8. 【autojs】Auto.js Pro系统intent代码
  9. python检测字符串是否包含特殊符号
  10. VB通过洗牌算法生成随机数ID