OAuth 及 移动端鉴权调研

简介: # OAuth OAuth是一个解决用户无需向第三方应用提供用户名密码,让第三方应用访问用户私密资源的授权方案。 举例: 用户a,在网站B存有私密信息(年龄、邮箱、头像),而a在访问第三方网站C时,为了让C可以知道a在B网站上的信息,可以通过OAuth授权,让C访问B拿到a的信息。 ## 逻辑步骤 > a是下图里的User,B是下图里的Consumer,C是Serv

OAuth

OAuth是一个解决用户无需向第三方应用提供用户名密码,让第三方应用访问用户私密资源的授权方案。

举例: 用户a,在网站B存有私密信息(年龄、邮箱、头像),而a在访问第三方网站C时,为了让C可以知道a在B网站上的信息,可以通过OAuth授权,让C访问B拿到a的信息。

逻辑步骤

a是下图里的User,B是下图里的Consumer,C是Service Provider

  • B网站支持OAuth协议;
  • C网站在B网站注册,拿到appId和appSecret,并事先编辑验证回调地址;
  • a访问C,并点击获取B网站信息的操作;
  • C网站生成带一个未授权RequestToken的链接并跳转到网站B,要求用户进行授权;
  • 用户登录后点击授权,完成对RequestToken的授权;
  • C网站拿着授权后的RequestToken问B拿AccessToken;
  • 通过AccessToken + 资源接口 访问用户的私密资源;
作者:郭无心
链接: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目前有三个版本

  • OAuth1.0 解决用户资源授权问题,以前的OpenId只解决了who的问题,没办法对资源进行区分隔离
  • OAuth1.0a 为了解决OAuth1.0存在的安全漏洞,做了个升级补丁
  • OAuth2.0 由于OAuth1.0的签名认证逻辑过于复杂、对多终端不友好,所以做了2.0的协议,不兼容OAuth1.0。OAuth2.0 支持多种授权方式(方便不同终端对接)。

服务端对接

以Nodejs为例

使用社区方案passport,passport定义了一套权限认证接口。主流的第三方OAuth登录有对应的passport接口实现,如:facebook、twitter、google等。github搜索 passport ${platform}就能找到响应的实现。

具体步骤:

  1. 到对应平台的开发者中心,申请 appId, appSecret,并配置callback回调地址(上图中E步在Consumer的地址);
  2. 服务端(Nodejs): 根据passport strategy对应文档,配置appId、appSecret;
  3. 网页端: 加上访问对应strategy的链接增加授权入口;
  4. 移动端: 根据平台提示,下载对应移动端SDK;

注意,找到的strategy有的是走 OAuth1.0a 有的是走 OAuth2.0 的,比如twitter是OAuth1.0a,如果后端需要拿AccessToken则要自己实现(OAuth2.0回调时直接返回AccessToken),使用的时候需要看清楚。

移动端鉴权方案

上面介绍完OAuth token完成第三方鉴权,并获取资源。

我们自己的服务对于移动端鉴权也可以完成OAuth支持,比如Nodejs可以用oauth2orize

使用OAuth支持移动端存在的问题

颁发出去的accessToken需要存储并控制过期,redis会比较合适。

其他方案?—— 自己实现cookie session机制

而如果已经使用了redis,则实现类似cookie-session的机制逻辑上更简单,而且接口鉴权跟web端基本保持一致。

请求时带着token,在后端通过加盐hash等手段生成sessionId,恢复session并进行鉴权,这样可以做到前端和app端统一登录,并且走同一套session存储。

这么做的工作量是重写session模块,在浏览器端解析token并完成session设置。同时redis依然是系统依赖。

有更简洁的方法吗? —— jwt

https://jwt.io

当然有,对于鉴权我们的需求是两个: 鉴权、恢复信息。

jwt可以同时完成,token鉴权、payload存储信息的功能。

操作步骤如下:

  1. 用户通过鉴权接口 (用户名密码登录/第三方登录后的AccessToken鉴权),服务端返回生成的 jwt,jwt中包含了用户的非敏感信息(session);
  2. 移动端拿到jwt后,存储在本地,并按照约定的时间通过AccessToken等方式到后端刷新 jwt;(具体过期时间和过期策略可以服务端跟客户端商量)
  3. 新的请求带着jwt时,服务端只要解析jwt,并取出payload做为session供后面的业务逻辑使用就行了;

缺点:

  1. 请求协议如果不是ssl,则jwt的payload是暴露在网路中的,所以里面不能存储敏感信息;
  2. jwt相对一般的token体量大,网络开销受payload体积影响,因此session不宜太大;

实现cookie session机制用redis存储的方式可以作为升级方案。

有更好的方案欢迎讨论

reply to start a discussion

References

目录
相关文章
|
SQL 运维 负载均衡
双活中心高效同步机制
双活中心高效同步机制
763 1
|
资源调度 测试技术 Apache
YARN中的CPU资源隔离-CGroups
YARN中集成了CGroups的功能,使得NodeManger可以对container的CPU的资源使用进行控制,比如可以对单个container的CPU使用进行控制,也可以对NodeManger管理的总CPU进行控制。
10625 1
|
人工智能 自然语言处理 算法
大模型 is all you need?
本文旨在通过对业务案例、prompt技巧、大模型原理等探讨,让大家能够更好地在实际业务中应用大模型。
464 16
|
安全 Linux Shell
ssh 远程控制服务
SSH(Secure Shell)是一种用于远程登录的安全协议,相比FTP和Telnet,它提供了更高的安全性,避免了明文传输带来的风险。要使用SSH远程管理Linux系统,需要配置sshd服务。本文介绍了如何克隆Linux服务器、修改网络配置,并通过SSH连接两台服务器,最后在目标服务器上创建一个日志文件。
311 5
|
人工智能 弹性计算 API
通义万相AI绘画创作一键部署实现
通义万相AI绘画创作提供了一键部署流程,点击链接登录,即可开始绘画生成。
1016 13
|
人工智能 API 持续交付
通义万相AI绘画创作解决方案评测
在阿里云平台上,资源部署体验流畅,提供详尽步骤,包括开通服务、获取API-KEY、创建网络资源和服务器。一键部署借助ROS脚本,简化了程序安装,API设计直观,适合快速集成。用户可自定义登录凭据,部署过程自动化,大约5分钟后即可通过URL访问。服务响应快,模型泛化能力强,支持多种图片风格,图片质量高。建议增加更多风格滤镜、多语言支持和动态图像生成等新功能。成本效益高,易用性强,适合广泛行业,文档丰富,适合新手。
373 4
|
安全 算法 关系型数据库
线程安全--深入探究线程等待机制和死锁问题
线程安全--深入探究线程等待机制和死锁问题
517 1
|
存储 运维 监控
双活中心故障检测与切换机制
双活中心故障检测与切换机制
750 2
|
消息中间件 监控 API
信用算力基于 RocketMQ 实现金融级数据服务的实践
导读: 微服务架构已成为了互联网的热门话题之一,而这也是互联网技术发展的必然阶段。然而,微服务概念的提出者 Martin Fowler 却强调:分布式调用的第一原则就是不要分布式。 纵观微服务实施过程中的弊端,可以推断出作者的意图,就是希望系统架构者能够谨慎地对待分布式调用,这是分布式系统自身存在的缺陷所致。
10250 87
|
小程序 JavaScript 前端开发
微信小程序如何开发,调试技巧,对程序员小白来说太重要了
@[TOC](目录) 简要介绍一下微信小程序开发的基本流程和一些常用组件,供你参考。在实际开发过程中,你可以根据需求选择合适的组件和 API 进行开发。 # 一、具体开发工作 ## 1. 准备工作 首先,你需要注册成为微信小程序开发者。访问微信公众平台(https://mp.weixin.qq.com/)并用你的微信号登录。进入“小程序”模块,按照指引创建一个小程序。 ## 2. 开发环境 下载并安装微信开发者工具。打开微信开发者工具后,你会看到一个模拟器,可以在其中预览小程序的效果。 ## 3. 创建小程序 在微信开发者工具中,创建一个新的小程序项目。填写小程序的基本信息,如名称、图标等。点
986 0

热门文章

最新文章