Spring Social之OAuth协议(第三方登录)

SpringSocial框架简介
旨在将系统连接社交网络,如QQ、微信、微博等。基于Oauth2协议,对主流的社交网络都有很好的支持

SpringSocial基本原理:
Spring Social之OAuth协议(第三方登录)
第三方登录:第三方获取微信用户的登录些信息,并将用户的数据构建成Authentication并放入SecurityContext中,那么这就相当于第三方应用拿着微信的用户信息进行了第三方应用的登录

例如:
QQ第三方登录流程:
Spring Social之OAuth协议(第三方登录)
在标准的OAuth2协议中,1-6步都是固定,只有最后一步,不通的服务提供商返回的用户信息是不同的。Spring Social已经为我们封装好了1-6步。

SpringSocial就是将上述流程实现的框架
Spring Social之OAuth协议(第三方登录)
第三方登录的流程:
Spring Social之OAuth协议(第三方登录)

Spring Social之OAuth协议(第三方登录)
Spring Social之OAuth协议(第三方登录)

OAuth协议:
OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用
OAuth 2.0 是一个行业的标准授权协议。OAuth 2.0 专注于简化客户端开发人员,同时为 Web 应用程序,桌面应用程序,手机和客厅设备提供特定的授权流程
它的最终目的是为应用颁发一个有时效性的令牌 toke。使得第三方应用能够通过该令牌获取相关的资源。常见的场景就是:第三方登录
Spring Social之OAuth协议(第三方登录)

如果要开发一个第三方应用进行微信图片的数据的读取,并将照片进行美化处理。那么这里就会出现微信不会将微信的账号和密码给第三方应用的问题,即使给了用户名和密码也会存在微信账号安全问题以及微信应用的权限问题。因此OAuth协议就是为了解决这些问题的
Spring Social之OAuth协议(第三方登录)
OAuth协议运行流程
相关角色:

2.1:Provider(服务提供商):在我们的例子中微信给第三方应用数据,就可以称为服务提供商
2.1.1:Authorization Server(认证服务器):认证用户身份,产生令牌
2.1.2:Resource Server(资源服务器):存放数据的。并在这里验证请求中携带的Token信息
2.2:Resource Owner(资源所有者):用户的自拍数据,所有者为用户自己
2.3:Client(第三方应用):慕课微信助手
Spring Social之OAuth协议(第三方登录)

访问流程:

在第二步中有这几种授权模式:
Spring Social之OAuth协议(第三方登录)
授权码模式:
Spring Social之OAuth协议(第三方登录)
授权码模式:流程最完整,功能最完善

简化模式:
Spring Social之OAuth协议(第三方登录)

OAuth 2.0 协议中的一些角色:
user-agent:用户代理,帮助资源所有者与客户端沟通的工具,一般为 web 浏览器,移动 APP
resource server :资源服务器,托管受保护资源的服务器(例如微信服务器)
client,客户端,使用资源所有者的授权代表资源所有者发起对受保护资源的请求的应用程序。如:例如我们自己开发的web网站,移动应用等
authorization server: 授权服务器,能够向客户端颁发令牌。
user-agent:用户代理,帮助资源所有者与客户端沟通的工具,一般为 web 浏览器,移动 APP
等(例如微信客户端,qq客户端)

1:第三方应用(开发者)请求授权时会引导用户到认证服务器,用户同意授权。
2:认证服务器返回一个授权码并返回到提前定义好的第三方的一个Url上面。
3:第三方应用携带授权码再去认证服务器去请求Token
因此授权码模式是要求第三方应用要有独立的服务器的,而简化模式则不需要

流程:
1.客户端(app):用户点击qq,微信,微博登录
2.app内部调用服务提供商提供的api接口,通过api接口可以将用户导向服务提供商的认证服务器
3.用户点击同意授权,一般是在服务提供商的请求OAuth登录页面进行这一过程,拿到认证服务器的授权码同时返回客户端app
4.然后客户端app通过接口将授权码和账号信息提交给服务器
5.服务器根据这些信息去第三方获取对应的用户信息

注意点:
1.这里重定向的url是针对web浏览器中第三方登录设计的,当用户授权之后会跳转到设定的页面,但是对于app的第三方登录来说没有什么影响
2.code是个有生命周期且只可使用一次的字符串。令牌就是accessToken有过期时间限制,但是这个过期时间一般比refreshToken时间更长一点,当AccessToken快要过期的时候,很多平台可以使用一个RefreshToken来要求刷新AccessToken