一、什么是开放平台接口

场景 : 总公司与子公司 对接接口 还有一些合作伙伴

总公司 提供接口 1、能够获取到哪个子公司调用 2、授权机制,能够灵活控制接口调用权限。 例:阿里和顺丰闹矛盾,顺丰把权限修改阿里巴巴就不能调用接口。

很多公司都有开放平台接口可以供我们练习使用的哈哈:比如腾讯的QQ互联网、微信开放平台、蚂蚁金服开放平台 、微博开放平台,比如实现功能QQ联合登陆、微信扫码登陆。都提供了相应的开放平台。

访问:https://github.com/spring-cloud/spring-cloud-security 源码中有这个组件 帮助快速搭建开放平台 实现授权流程

springcloud通信socket长连接 springcloud接口_springcloud

**OAuth2.0:**Oauth2.0(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务器提供者上的信息,而不需要将用户名和密码提供给第三方网站或者分享他们数据的所有内容。

以QQ联合登录为例,它使用的就是oauth2.0协议,进行授权认证时通常有一下几个步骤: 1.生成授权链接,获取授权码 2.使用授权码获取accessToken 3.使用accessToken获取openId 4.使用openId获取用户信息

常见的开放平台: 腾讯的QQ互联、微信开放平台、蚂蚁金服开放平台、微博开放平台,可以实现QQ联合登录、微信扫码登录等第三方登录功能。 QQ互联开放平台:https://wiki.connect.qq.com/准备工作_oauth2-0

OAuth2四种授权方式: 1、授权码(认证码)模式(Authorization code):用在客户端与服务器端应用之间的授权,response_type=code 2、简化(隐形)模式(Impilict):应用在移动app或者web app(在移动设备上的,如在手机中调用微信来进行认证授权),response_type=token 3、密码模式(Resource Owner Password Credentials):应用直接都是受信的,如都是由同一家公司开发,grant_type=password 4、客户端模式(Client Credentials):用在应用API访问,grant_type=client_credential一般情况下,1和3应用比较多,2都是应用在移动端,4应用不多

相关概念appId (商户号,给子公司或者合作商户提供的)+ appKey(密钥,验证密钥) (这俩配套的 都是必备的,并且appID永久不能改,appKey可以改)

Authorization code: 授权码,用来获取accessToken

accessToken: 调用接口权限访问令牌

redirect_uri: 回调地址 授权成功 重定向地址 保证安全性 不要随便拼接成别的地址

openId: 开放平台生成唯一的id

二、调用QQ互联

1、需要在qq互联上面申请权限获取appId和appKey

2、调用连接获取授权码

https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=101462456&state=888&redirect_uri=http://mayikt.s1.natapp.cc/qqLoginBack client_id就是申请的appId(商户号),state是防止csrf攻击的,随机生成的

点击授权登录之后浏览地地址会变化

springcloud通信socket长连接 springcloud接口_开放平台_02

code即为授权码(只要1分组有效期)

3、使用用户获取的授权码,获取对应的accessToken 获取到授权码之后,代表登录成功了,但是不代表合作伙伴已经对接成功。 授权码获取accessToken,然后再去获取openId,然后再去数据库查询关联的openId。有的话直接登录,没有就需要关联

https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&client_id=101462456&client_secret=4488033be77331e7cdcaed8ceadc10d5&code=E91DF5B0E2455A6B2AF25CD9FA1C7582&redirect_uri=http://mayikt.s1.natapp.cc/qqLoginBack 通过授权码调用,grant_type就是为authorization_code client_id为商户号 client_secret为appKey code就是授权码 redirect_url:重定向地址,与前面保持一致

通过访问这个地址就会获取到 accessToken!! 拿到accessToken就可以调用接口了! (父公司可以通过 accessToken 逆向出 谁在调用我的接口。 在表里面accessToken和openId是关联的(每个合作的网站域名是唯一的,一个域名一个openid的))

在Spring Cloud里面流程底层已经帮助实现了哈 只要关注表结构就OK了

springcloud通信socket长连接 springcloud接口_开放平台接口_03

4、使用accessToken获取用户openid

使用刚刚生成的accessToken

https://graph.qq.com/oauth2.0/me?access_token=B2FD1997D149313F16C93D91C75AC75E

springcloud通信socket长连接 springcloud接口_访问令牌_04

获取到 openId就可以获取到用户相关信息了,授权码只能用一次! 授权了一段时间后就销毁了。需要重新授权。

5、使用openId获取用户信息

https://graph.qq.com/user/get_user_info?access_token=B2FD1997D149313F16C93D91C75AC75E&oauth_consumer_key=101462456&openid=4B1717CBBFE1E900D2A1482C4A18B3BD

此时会返回各种用户信息的~ 包括头像 图片之类的 性别 地址等等

三、原理分析

OAuth认证和授权的过程如下: 1、用户访问第三方网站网站(自公司),想对用户存放在服务商的某些资源进行操作。 2、第三方网站(自公司)向服务商(父公司)请求一个临时令牌。 3、服务商验证第三方网站的身份后,授予一个临时令牌。 4、第三方网站获得临时令牌后,将用户导向至服务商的授权页面请求用户授权,然后这个过程中将临时令牌和第三方网站的返回地址发送给服务商。 5、用户在服务商的授权页面上输入自己的用户名和密码,授权第三方网站访问所相应的资源。 6、授权成功后,服务商将用户导向第三方网站的返回地址。 7、第三方网站根据临时令牌从服务商那里获取访问令牌。 8、服务商根据令牌和用户的授权情况授予第三方网站访问令牌。 9、第三方网站使用获取到的访问令牌访问存放在服务商的对应的用户资源。