我们使用grpc对外的接口,进行服务,模拟对外认证的接口

首先我们要了解oauth的基本认证过程

在这里插入图片描述

第三方的服务端,在oauth2.0中作为一个客户端的身份,进行请求数据。

用户进行选择第三方的登陆,比如选择到某一个第三方的平台进行登陆,则会跳转到第三方登陆平台

用户输入用户名密码,在第三方平台进行登陆,,如果登陆成功,则返回code。

客户端,也就是我们想要登陆的网站,将会读取code,并且将会携带这个code,和第三方网站所颁发的密码,进行请求token,如果code和注册时所得到的密码,都验证成功,此时,第三方客户端会返回一个token。

我们登陆的网站会携带这个token去请求用户身份资源的服务器,如果token比对成功,则返回用户的信息所以我们需要一些服务

codeserver,作用,分发code,验证code的准确性

tokenserver,作用分发token,验证token的准确性

loginserver,作用,登陆成功后,调用codeserver得到code

userdetailserver,作用调用tokenserver的token验证,验证token是否合法,如果合法,进行返回用户的基本信息继续,我们大概看一下这些功能具体怎样实现。

实现

codeserver

其实我们的code和token,主要是使用redis数据库进行实现,并且给申请的code和token设置过期时间, 也就是说,在数据库中实现一个定时的作用,如果,申请完code,长时间不申请token则这个code会过期,就会让用户重新进行登陆,重新获取code

至于其他的endpoint层和transport层等等,就先不写了,我们就这篇文章主要是看怎样模拟实现oauth

tokenserver
useroauthserver

基本原理就是这样,但是我们还是差一个userdetail的服务端

这个服务端,主要作用就是拿到请求的token,并进行检验,如果检验成功,返回用户数据,至于怎样检验,就是调用tokenserver中的检验接口。

这里就不写了,留给读者完成。

我写的这三个接口在gitee上有源码,是基于golang写的,使用的框架有grpc,go-kit的服务框架。

补充:go-kit实践之2:go-kit 实现注册发现与负载均衡

一、介绍

grpc提供了简单的负载均衡,需要自己实现服务发现resolve。我们既然要使用go-kit来治理微服务,那么我们就使用go-kit的注册发现、负载均衡机制。

go-kit官方【stringsvc3】例子中使用的负载均衡方案是通过服务端转发进行,翻找下源码go-kit的服务注册发现、负载均衡在【sd】包中。下面我们介绍怎么通过go-kit进行客户端负载均衡。

go-kit提供的注册中心

1、 etcd

2、 consul

3、 eureka

4、 zookeeper

go-kit提供的负载均衡

1、 random[随机]

2、 roundRobin[轮询]

只需实现Balancer接口,我们可以很容易的增加其它负载均衡机制

etcd注册发现

etcd和zookeeper类似是一个高可用、强一致性的存储仓库,拥有服务发现功能。 我们就通过go-kit提供的etcd包来实现服务注册发现

二、示例

1、protobuf文件及生成对应的go文件

生成对应的go语言代码文件:protoc --go_out=plugins=grpc:. book.proto (其中:protobuf文件名为:book.proto)

2、Server端代码

3、Client端代码

4、运行

(1)安装etcd并启动

由于本实例服务发现采用了etcd,因此在运行之前需要先安装etcd并运行。

(2)etcd是一个分布式一致性键值存储,其主要用于分布式系统的共享配置和服务发现。etcd由Go语言编写.

下载地址: https://github.com/coreos/etcd/releases

将压缩文件解压到指定文件夹,解压后的目录如下:

其中etcd.exe是服务端,etcdctl.exe是客户端。点击etcd.exe运行etcd服务。(注:设置环境变量自由决定,此实例也可以不用设置)

(2)实例运行

先运行Server端,在运行Client端,效果如下:

5、问题汇总

如果运行时,提示一下错误:

说明golang.org/x/net/包下的 trace 与go.etcd.io/etcd/vendor/golang.org/x/net/ 包下trace有冲突,解决方法:找到go.etcd.io\etcd\vendor目录:

由于已经在src目录下存在golang.org 与google.golang.org两个包

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。