OAuth 及 移动端鉴权调研

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: # 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

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
7月前
|
安全 Java 数据安全/隐私保护
|
11月前
|
存储 前端开发 JavaScript
前端笔记_OAuth规则机制下实现个人站点接入qq三方登录
前端笔记_OAuth规则机制下实现个人站点接入qq三方登录
119 1
|
搜索推荐 数据安全/隐私保护
直播程序源码OAuth协议:开放授权的重要性
在直播程序源码平台,需要OAuth协议这样的协议,OAuth协议保证了用户在使用直播程源码平台结合第三方应用程序的技术功能时的安全性与方便性,也为直播程序源码平台的用户提供了许多互动功能,是让直播程源码平台成为更高质量、更好的平台。
直播程序源码OAuth协议:开放授权的重要性
|
前端开发
淘东电商项目(33) -SSO单点登录(改造SSO认证服务登录界面)
淘东电商项目(33) -SSO单点登录(改造SSO认证服务登录界面)
110 0
|
小程序 开发者
微信公众号配置 Token 认证以及消息推送功能(二)
微信公众号配置 Token 认证以及消息推送功能(二)
1063 0
|
移动开发 小程序 安全
微信公众号配置 Token 认证以及消息推送功能(一)
微信公众号配置 Token 认证以及消息推送功能
978 0
|
安全 数据安全/隐私保护 开发者
构建安全的身份认证系统:OAuth和OpenID Connect的实践
在当今的互联网世界中,安全的身份认证是保护用户隐私和数据安全的重要组成部分。OAuth和OpenID Connect是两种常用的身份认证协议,本文将介绍它们的原理和实践,以及如何在应用程序中集成和使用它们来构建安全的身份认证系统。
441 0
|
数据安全/隐私保护
,基于JWT和OAuth2.0应用接入第三方统一认证服务
一套应用服务,有自己的独立登录接口,独立认证服务(JWT认证),独立用户等,需要接入第三方的统一认证系统,实现用户统一登录;
513 0
,基于JWT和OAuth2.0应用接入第三方统一认证服务
|
缓存 前端开发 安全
手把手带你接入 OAuth 2.0 授权服务
支付宝等开放平台授权登录场景底层原理 OAuth 2.0 授权技术。 OAuth 2.0 四个关键角色:客户端、第三方软件、授权服务、受保护资源。 本文从第三方软件角度切入,带你手把手接入授权服务,引导用户跳转授权服务授权页,授权服务颁发授权码给第三方软件,第三方软件使用授权码和授权服务交互换取访问令牌,最后通过访问令牌请求授权服务的受保护资源(这块用 api ),进而实现一整套 OAuth 2.0 授权许可许可机制流程。
1055 0
手把手带你接入 OAuth 2.0 授权服务
|
JSON 安全 数据格式
你确定懂OAuth 2.0的三方软件和受保护资源服务?(上)
你确定懂OAuth 2.0的三方软件和受保护资源服务?
135 0
你确定懂OAuth 2.0的三方软件和受保护资源服务?(上)