Google登录授权详细过程

前言


这篇文章包含了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;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/10333.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

换IP软件如何使用,一起来看下换IP软件的使用教程

现在的互联网趋势&#xff0c;越多越多的人需要使用动态IP&#xff0c;像爬虫采集、微信用户、网络营销、博客互动、SEO优化等等&#xff0c;都需要使用动态IP去隐藏自身的IP地址去操作&#xff0c;这个使用可以使用换IP软件。其实现在市面上很多换IP软件都支持动态静态线路&am…

如何屏蔽所有国外ip,禁止国外IP访问网站

众说周知一般的CC攻击DDOS攻击等大范围的网络攻击都来自境外&#xff0c;但是如何能大批量的屏蔽国外ip&#xff0c;禁止国外IP访问网站应该怎么做&#xff0c;相信大家都会说加黑名单啊&#xff0c;但是很多人可能还不知道怎么添加黑名单&#xff0c;黑名单的操作也是比较麻烦…

如何换IP?换IP最简单的方法在这里!

许多朋友在日常生活和工作过程中都会遇到需要换IP的情况&#xff0c;因为一个IP频繁的操作就会导致IP被封掉&#xff0c;比如说需要投票&#xff0c;薅羊毛&#xff0c;网络推广等等。更换IP的方式有很多&#xff0c;今天就来给大家介绍一下IP是什么&#xff0c;并且我们应该怎…

网络层:虚拟专用网VPN和网络地址转换NAT

1.网络层&#xff1a;虚拟专用网VPN和网络地址转换NAT 笔记来源&#xff1a; 湖科大教书匠&#xff1a;虚拟专用网VPN和网络地址转换NAT 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 1.1 虚拟专用网VPN 专用网和公用网的特点 专用网络&#xff…

如何修改IP地址?

1.使用cmd的ipconfig 2.查到ip 3.找到网络与Internet设置 4.找到高级网络设置 5.找到连接的网络选择属性 6.编辑IP分配 7.将IP地址设置为手动 8.更改地址 9.修改DNS 10.保存后重新查询为新的ip地址 11.注意事项&#xff1a;在使用前ping下ip地址确保为空闲&#xff0c;类似第二…

如何更换IP?最简单的换IP方法

许多人在工作生活中经常需要用到换IP&#xff0c;比如帮朋友投票&#xff0c;刷单&#xff0c;做网络推广等等。大量的工作需要换IP&#xff0c;单单靠手动切换IP的方法比较耗时间&#xff0c;效果也不好&#xff0c;那么如何更换IP呢&#xff1f;今天黑洞代理为大家整理了几种…

看TAP如何让当代银行与加密交易相融合

支付解决方案是比特币和其他代币颠覆的一大关键领域。总体而言&#xff0c;加密货币的出现有希望解决银行业现有的问题。 尽管加密货币行业茁壮发展&#xff0c;但为了充分发挥其潜力&#xff0c;这项技术必须适应现有系统。 银行卡支付和电子银行已成为最常用的支付结算方式…

ChatGPT中国赛开卷!互联网大佬自掏5000万美元入局

来源&#xff1a;新智元 ChatGPT&#xff0c;已经炸醒了国内创投圈。去年圈内躺平一整年&#xff0c;今年巨头纷纷ALL IN。 连已退休三年的美团网创始人王慧文&#xff0c;都被炸出来了。 如同一声惊雷&#xff0c;王慧文昨晚22:12在朋友圈发表的一条复出创业宣言&#xff0c;炸…

区块链:IOTA 交易,确认和共识 (DAG)

Tangle 初始状态 与区块链技术不同&#xff0c;IOTA 并不是一条有着时间序列概念&#xff0c;每个区块前后相连的链&#xff0c;链中的每个块包含一些交易。在 IOTA 中&#xff0c;每笔交易都可以其他交易连接&#xff08;所谓连接&#xff0c;就是验证其他交易&#xff09;&am…

非同质化代币(NFT)概述

非同质化代币&#xff08;NFT&#xff09;概述 前言一、NFT是什么&#xff1f;同质化——Fungible非同质化——Non-Fungible区别分析代码分析ERC20可选函数必要函数事件 ERC721事件必要函数可选函数于ERC721Metadata接口下的于ERC721Enumerable接口下的 二、历史与发展起源1993…

简析Starcoin在新一代公链方向的探索

文章来源&#xff1a;币圈百科 作者&#xff1a;一棵杨树X 据悉&#xff0c;Starcoin主网即将上线&#xff0c;项目方日前发起了为期一个月的《Starcoin区块链安全赏金计划》&#xff08;3.24-4.24&#xff09;&#xff0c;为部署主网上线做最后一公里的检验与冲刺。&#xff…

中银国际在以太坊上发行代币化票据?三种可能,扑朔迷离!

* * * 原创&#xff1a;刘教链 * * * 号外&#xff1a;今天在“刘教链Pro”发表了一篇内参文章&#xff0c;《内参&#xff1a;对币本位高抛低吸策略的一点儿思考》&#xff08;次条&#xff09;&#xff0c;以及一篇原创文章《他提案将SEC主席Gary Gensler撤职》&#xff08;…

DAO概念板块代币大盘点,你又把握了几个?

你的认知决定你能够走多远! ​​ 大家好我是小哲,你的认知决定你能够走多远,元宇宙的火爆已成定局,下面就来聊聊DAO模块。你又认识多少呢? 火爆的dao大家应该都有听到过DAO这个概念,但是可能对于DAO具体是什么还不太了解。说白了,其实DAO很好理解,他是一个去中心…

Paradigm联合创始人2017年神文:区块链是元宇宙的基础层

这是一篇看完让我毛骨悚然&#xff0c;汗毛直立的文章。 作者Paradigm联合创始人Fred Ehrsam 发表于2017年2月&#xff0c;写的却是4年后当下的流行&#xff1a;元宇宙、区块链、Crypto、VR…… 这认知差距&#xff0c;远超我的想象&#xff0c;2017年2月&#xff0c;大多数人…

三款软件,让你的文字转语音更简单

文字转语音软件我使用过很多&#xff0c;其中也有我觉得非常好的&#xff0c;那我就从中挑选三个我觉得使用性、实用性都非常好的软件推荐给你们。 1&#xff1a;nopapp 这是一款在线文字转语音软件&#xff0c;只能网页端进行使用。 里面有四种类型的声音&#xff0c;女性&…

文字转语音怎么做?分享三种配音方法,真人语音很逼真

文字转语音怎么做&#xff1f;分享三种配音方法&#xff0c;真人语音很逼真 说到文字转语音或者配音&#xff0c;很多小伙伴都会习惯于自己配音&#xff0c;认为这样配出来的声音会更加的自然。但是不得不承认的是&#xff0c;如果没有一点点的配音功底&#xff0c;那么自己配…

如何将文字转化为语音?方法超级简单,立马就能学会配音

很多人问&#xff1a;声音不好听可以直接文字转语音配音吗&#xff1f; 当然可以了。 我可以放心的告诉你&#xff0c;配音完全不必担心声音不好听&#xff0c;虽然现在做自媒体短视频和广告的人非常多&#xff0c;但99%的人都不是专业配音员出身&#xff0c;自己配出来的音差…

如何将视频中的语音转成文字?3招教会你实现转换

有时候我们从手机或者电脑接收到的视频&#xff0c;需要对其中的文字内容进行整理&#xff0c;形成一份电子文档。如果大家还一直用传统的方式&#xff0c;通过观看视频进行手动整理&#xff0c;那未免有些浪费时间。想要快速得到视频中的文字内容&#xff0c;我们不妨试试一些…

怎么将视频里的语音转成文字?不妨试试这三款转文字工具

现如今&#xff0c;很多的学生会喜欢在网上看辅导视频&#xff0c;能够方便我们随时查看&#xff0c;快速学习。当你需要整理视频中的教学笔记的时候&#xff0c;是怎么进行操作的呢&#xff1f;还是在用边看边记录的方式吗&#xff1f;如果视频较长的话&#xff0c;那记录起来…