前言

最近公司需要将Google关联登录整合到项目的资源服务器中,但是其中遇到了很多坑,在这里记录一下。

环境:
操作系统:win7
jdk版本:1.8
IDEA:2019.2
SpringBoot版本:2.1.6.RELEASE
Spring-cloud-starter-oauth2版本:2.1.0.RELEASE

注意,要做Google关联登录,当然得先翻墙才行。

正文

一、关于oAuth2的认证服务器和资源服务器的理解

相信在做关于Google关联登录的小伙伴,都应该会使用SpringSecurity+oAuth2来搭建一个本地的认证服务和资源服务,整个认证过程以下图形式展示:

(参考:https://www.funtl.com/zh/spring-security-oauth2/%E4%B8%BA%E4%BB%80%E4%B9%88%E9%9C%80%E8%A6%81-oAuth2.html)

在微服务架构中,很多服务都可以被看做为资源服务,如:商品服务、用户服务、数据服务等等,这些资源服务都会被oAuth2给保护起来,每次请求这些资源服务都会认证服务器认证授权。

二、Google关联登录

要实现Google关联登录,那么就需要我们这边的服务通过ClientId,Secret以及 /oauth2/auth认证回调地址,以及/oauth2/token获取token的地址,需要注意的一点是我们这边的是“资源服务”,Google那边的是“认证服务”,我们的“资源服务”需要获取到Google用户信息,以及api功能调用,就首先得去Google的认证服务去进行认证鉴权,认证鉴权通过之后,就会获取到用户信息以及access_token信息,拿着Google给的access_token就可以去调Google API的功能接口了。

下面看看我们是如何用我们的资源服务去Google的认证服务去进行认证鉴权,然后获取到用户信息以及token等信息。

  1. 第一步,去googleApis设置凭证:https://console.developers.google.com/apis/dashboard?project=keen-jigsaw-263908&angularJsUrl=
    不过在设置及凭证之前,需要先创建项目,

设置凭证,在创建凭证的时候,需要将应用类型选择为Web Application:

可以看到,凭证设置好之后,会获取到一个客户端ID以及客户端密钥。而已授权的JavaScript就是我们资源服务的IP+端口号,已货权的重定向URI要设置成:http://server:ip/login 或者是 http://server:ip/login/xxx

  1. .设置WebSecurityConfiguration 配置文件
import org.springframework.boot.autoconfigure.security.oauth2.client.EnableOAuth2Sso;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;@Configuration
@EnableOAuth2Sso
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().disable().antMatcher("/**").authorizeRequests().antMatchers("/", "/index.html").permitAll().anyRequest().authenticated();}
}
  1. 在resources/static目录下添加index.html
<!DOCTYPE html>
<html><head><meta charset = "ISO-8859-1"><title>Insert title here</title></head><body><a href = "user">Click here to Google Login</a></body>
</html>
  1. 在OAuth2ResourceApplication中添加接口/user
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.security.Principal;@SpringBootApplication
@RestController
public class OAuth2ResourceApplication {public static void main(String[] args) {SpringApplication.run(OAuth2ResourceApplication.class, args);}@RequestMapping(value = "user")public Principal user(Principal principal) {return principal;}
}
  1. application.yml设置google配置
security:oauth2:client:client-id: 928234317947-34p5hjm9ht9slnohjlu98kerdh6sqrjl.apps.googleusercontent.comclient-secret: hy3uadMLKiZyXqKN0l8IpY8Waccess-token-uri: https://www.googleapis.com/oauth2/v3/tokenuser-authorization-uri: https://accounts.google.com/o/oauth2/authtoken-name: oauth_tokenauthentication-scheme: queryclient-authentication-scheme: formscope: profile emailregistered-redirect-uri: https://www.baidu.comresource:user-info-uri: https://www.googleapis.com/userinfo/v2/meprefer-token-info: false

client-id和client-secret就是刚刚在GoogleAPIS中设置的内容

三、启动程序,获取Google登录信息



耐撕啊,终于出来了。

然而,回调一直循环在http://localhost:9098/login这个url,而又因为这个url没有认证通过,所以即使登录成功,也一直循环卡在登录页面。
找了很久的bug,都没找到原因,当时真是很痛苦,github、google、Stack Overflow各种找解决方案…


知道被同事点拨,发现原来公司VPN只能代理网页请求,然而程序通信“翻墙”就无法解决。此时恍然大悟,虽然Google登录成功,但是oAuth2这边回调获取token的时候,一直被墙,所以无法获取到principle,自然无法获取Google登录信息。待安装了一个新的可以将本机IP和DNS代理到国外时,就可以了。

所以针对这种情况,有两种解决方案:

  1. 使用VPN,例如:SoftEther VPN,将本机IP和DNS代理到国外,这样程序内部就能访问通回调地址了;
  2. 将程序部署到国外服务器上,也能够访问通回调地址;


开启VPN,然后再次进行登录授权之后,user信息终于获取到了:

可以看到,principle中包含了google登录用户的详细信息以及tokenValue等信息。

SpringBoot+OAuth2+Google关联登录相关推荐

  1. SpringBoot+OAuth2+JWT实现单点登录SSO完整教程,竟如此简单优雅!

    作者:狂乱的贵公子 来源:https://www.cnblogs.com/cjsblog/p/10548022.html 1.前言 技术这东西吧,看别人写的好像很简单似的,到自己去写的时候就各种问题, ...

  2. 微信公众号网页OAuth2.0授权登录并获取用户信息(SpringBoot实现)

    微信公众号网页OAuth2.0授权登录并获取用户信息(SpringBoot实现) 文章目录 微信公众号网页OAuth2.0授权登录并获取用户信息(SpringBoot实现) 准备工作 开发思路 具体代 ...

  3. SpringBoot OAuth2.0 使用短信验证码登录授权

    SpringBoot OAuth2.0 使用短信验证码登录授权 实现步骤: 自定义授权器,继承 AbstractTokenGranter 类: 重写 getOAuth2Authentication 函 ...

  4. Java实现Google第三方登录

    其实所有的第三方登录都是基于OAuth协议的,大多数平台都支持OAuth2.0,只有Twitter的是基于OAuth1.0来做的.所以只要弄明白一个,其他的什么qq.微信.微博的第三方登录也都一样.上 ...

  5. OAuth2 实现单点登录 SSO

    转载自  OAuth2 实现单点登录 SSO 1. 前言 技术这东西吧,看别人写的好像很简单似的,到自己去写的时候就各种问题,"一看就会,一做就错".网上关于实现SSO的文章一大堆 ...

  6. Cocos Creator Android 平台 Google 原生登录

    在海外项目中,我们通常需要接入 Google 帐号登录,这样可以提高应用使用率. 下面以 Android 平台 接入 Google 原生登录为例,进行详细说明. 一.准备工作 1.需要 Android ...

  7. [OAuth2.0三方登录系列文章-1]OAuth2.0与三方登录的端到端方案

    系列文章 [OAuth2.0三方登录系列文章-1]OAuth2.0与三方登录的端到端方案 [OAuth2.0三方登录系列文章-2]如何设计基于OAuth2.0的授权登录SDK以及竞品分析 [OAuth ...

  8. (附源码)Spring Boot 框架整合 OAuth2 实现单点登录 SSO 详细完整源码教程!

    1.  前言 技术这东西吧,看别人写的好像很简单似的,到自己去写的时候就各种问题,"一看就会,一做就错".网上关于实现SSO的文章一大堆,但是当你真的照着写的时候就会发现根本不是那 ...

  9. Facebook和Google第三方登录

    我做的是一个web网站,需要用到facebook和google登录,在经历头铁踩了好几个坑之后,终于找到了facebook和google的第三方登录方法,顺便总结一下问题 首先总结一下具体流程:(fa ...

最新文章

  1. python 开发版-Micropython开发板固件烧写教程
  2. Mac 技术篇-修改默认的python版本,mac最新版Python3.7.4的安装配置
  3. SAP Classification(物料特性)
  4. android 输入法的显示和隐藏
  5. C# 获取文件MD5值的方法
  6. 静态网页托管_视频教程:如何在IPFS上托管网站!
  7. 基于tcpdump实例讲解TCP/IP协议
  8. windows c++ 服务 当前用户提权_windows xp 提权
  9. 在一亿个数的有序数组中查找一个数所用时间
  10. L3G4200陀螺仪学习
  11. SSM项目实战:学生学籍管理系统
  12. kotlin使用遇到的坑。。。
  13. matlab 计算相关系数,MATLAB如何使用corrcoef函数计算样本数据的相关系数
  14. android资源文件assets
  15. 二层交换机,三层交换机及四层交换机的区别
  16. SDNU-1014 页码问题
  17. html语言教程教案,HTML语言与网页制作教案.doc
  18. unity urp内置lit材质源码解析(下)
  19. 越来越觉得马克思主义原理非常深邃
  20. 76个常识,你知几个

热门文章

  1. 从100套真题中提炼而出的100个经典句子
  2. VANT3无法使用slot引用外部icont
  3. 什么是瑞士加密谷Crypto Valley、CV Labs
  4. 2022年智能手机市场概括
  5. 腾讯云检测到你的服务器对其他服务器的攻击行为
  6. 一、Windows系统下安装Tensorflow2.x(2.6)
  7. ERROR: Failed to parse XML in E:\LWJ\AndroidStudioProjects\MyApplication6\app\src\main\AndroidManife
  8. 如何修改品牌电脑logo,让你电脑开机更个性
  9. Consumer消息拉取和消费流程分析
  10. 商标变更的流程介绍有哪些