本文共 3424 字,大约阅读时间需要 11 分钟。
OAuth是一个解决用户无需向第三方应用提供用户名密码,让第三方应用访问用户私密资源的授权方案。
举例: 用户a,在网站B存有私密信息(年龄、邮箱、头像),而a在访问第三方网站C时,为了让C可以知道a在B网站上的信息,可以通过OAuth授权,让C访问B拿到a的信息。
a是下图里的User,B是下图里的Consumer,C是Service Provider
作者:郭无心链接:https://www.zhihu.com/question/19851243/answer/75070070来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。此图已联系作者 +----------+ +----------+ | |--(A)- Obtaining a Request Token --------->| | | | | | | |<-(B)- Request Token ----------------------| | | | (Unauthorized) | | | | | | | | +--------+ | | | |>-(C)-| -+-(C)- Directing ---------->| | | | | -+-(D)- User authenticates ->| | | | | | +----------+ | Service | | Consumer | | User- | | | | Provider | | | | Agent -+-(D)->| User | | | | | | | | | | | | | | | +----------+ | | | |<-(E)-| -+-(E)- Request Token ------<| | | | +--------+ (Authorized) | | | | | | | |--(F)- Obtaining a Access Token ---------->| | | | | | | |<-(G)- Access Token -----------------------| | +----------+ +----------+
OAuth目前有三个版本
以Nodejs为例
使用社区方案,passport定义了一套权限认证接口。主流的第三方OAuth登录有对应的passport接口实现,如:facebook、twitter、google等。github搜索 passport ${platform}
就能找到响应的实现。
具体步骤:
注意,找到的strategy有的是走 OAuth1.0a 有的是走 OAuth2.0 的,比如是OAuth1.0a,如果后端需要拿AccessToken则要自己实现(OAuth2.0回调时直接返回AccessToken),使用的时候需要看清楚。
上面介绍完OAuth token完成第三方鉴权,并获取资源。
我们自己的服务对于移动端鉴权也可以完成OAuth支持,比如Nodejs可以用。
颁发出去的accessToken需要存储并控制过期,redis会比较合适。
而如果已经使用了redis,则实现类似cookie-session的机制逻辑上更简单,而且接口鉴权跟web端基本保持一致。
请求时带着token,在后端通过加盐hash等手段生成sessionId,恢复session并进行鉴权,这样可以做到前端和app端统一登录,并且走同一套session存储。
这么做的工作量是重写session模块,在浏览器端解析token并完成session设置。同时redis依然是系统依赖。
当然有,对于鉴权我们的需求是两个: 鉴权、恢复信息。
jwt可以同时完成,token鉴权、payload存储信息的功能。
操作步骤如下:
缺点:
实现cookie session机制用redis存储的方式可以作为升级方案。
reply to start a discussion