以前写过一个基于签名的公网API访问安全控制,另外一种方式是基于OAuth认证协议作安全控制。api
用户访问A客户端,使用B的服务及资源。B只有征得用户的受权,才容许A客户端使用B上用户的资源和服务。浏览器
第三方客户端,A客户端。安全
服务提供商,B服务。服务器
资源全部者,用户。app
用户代理,好比浏览器。url
认证服务器,B服务上用来提供认证的服务器。.net
资源服务器,B服务上用来存储用户的资源的服务器。代理
经过一个权限配置管理界面,业务方配置以后,获取appid,secret,redirect_url。code
经过受权获取受权码。blog
经过受权码+appid+secret获取access_token。
经过access_token操做api。
客户端不直接登录服务提供商,只登录受权层,以此将用户与客户端区分开。
客户端登录受权层所用的令牌,与用户的密码不一样。用户能够在登录的时候,指定受权层令牌的受权范围和有效期。
客户端登录受权层,服务提供商根据令牌的权限范围和有效期,向客户端开发对应服务。
用户打开客户端,客户端要求用户给予受权。
用户赞成给予客户端受权。
客户端使用上一步获取的受权,向认证服务器申请令牌。
认证服务器对客户端进行认证后,确认无误,赞成发放令牌。
客户端使用令牌,向资源服务器申请获取资源。
资源服务器确认令牌无误,赞成向客户端开发资源。
]
客户端受权:
/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,更新成功