之前写过一个,另一种方式是基于OAuth认证协议做安全控制。
说明
用户访问A客户端,使用B的服务及资源。B只有征得用户的授权,才允许A客户端使用B上用户的资源和服务。
名词
-
第三方客户端,A客户端。
-
服务提供商,B服务。
-
资源所有者,用户。
-
用户代理,比如浏览器。
-
认证服务器,B服务上用来提供认证的服务器。
-
资源服务器,B服务上用来存储用户的资源的服务器。
通过一个权限配置管理界面,业务方配置之后,获取appid,secret,redirect_url。
-
通过授权获取授权码。
-
通过授权码+appid+secret获取access_token。
-
通过access_token操作api。
OAuth在客户端与服务提供商之间,设置一个授权层。
客户端不直接登陆服务提供商,只登陆授权层,以此将用户与客户端区分开。
客户端登陆授权层所用的令牌,与用户的密码不同。用户可以在登陆的时候,指定授权层令牌的授权范围和有效期。
客户端登陆授权层,服务提供商根据令牌的权限范围和有效期,向客户端开发对应服务。
-
用户打开客户端,客户端要求用户给予授权。
-
用户同意给予客户端授权。
-
客户端使用上一步获取的授权,向认证服务器申请令牌。
-
认证服务器对客户端进行认证后,确认无误,同意发放令牌。
-
客户端使用令牌,向资源服务器申请获取资源。
-
资源服务器确认令牌无误,同意向客户端开发资源。
核心:用户给客户端授权,有了授权之后,客户端可以获取令牌,凭令牌获取资源。
]
参照URL:
客户端授权:
/authorize/app-connect?appid=APPID&redirect_url=xxx&response_type=code&state=xxx
验证通过,授权服务器重定向到配置的REDIRECT_URL&code=xxx 授权码
通过授权码获取access_token:
/authorize/access-token?appid=APPID&secret=SECRET&code=授权码&grant_type=authorization_code
验证通过,返回access_token,refresh_token,expires_in(过期时间戳)
通过refresh_token更新access_token:
/authorize/refresh-token?appid=APPID&grant_type=refresh_token&refresh_token=xxx
验证通过,返回新的access_token,refresh_token,更新成功