OAuth 2.0 的四种认证方式学习理解

本文为学习多篇OAuth 2.0文章后总结。
具体授权码模式请看 阮一峰老师讲解 OAuth 2.0 的四种方式
https://tools.ietf.org/html/rfc6749
https://www.ixigua.com/6841902954690118155

1. 授权码 - authorization code

客户端换取授权码,客户端调用服务端使用授权码换token,客户端调用服务端使用token访问资源
必须要有服务端
  • 授权码模式是四种模式中最繁琐也是最安全的一种模式。
  • client_id 存储在前端
  • client_secret 存储在服务器
  • 支持refresh token
  • 使用场景:第三方Web服务器端应用与第三方原生App,例如头条微信授权登录

授权码请求

    response_type:(必传)此时为"code"     
    appid:        (必传)微信服务器下发的标识第三方应用的
    client_id:    (必传)微信服务器下发的标识第三方应用的,和appid根据要求可选
    redirect_uri: (必传)授权成功后的重定向地址
    scope:(可选)标识授权范围
    state:(推荐)第三方应用提供的一个字符串,微信授权服务器会原样返回

1.请求授权码(示例)

GET /authorize?
response_type=code&
appid=wxe9199d568fe57fdd&
client_id=wxe9199d568fe57fdd&
state=wilson&
redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Foauth2&
scope=user,photo HTTP/1.1

2.授权码根据重定向地址返回 (前端地址?后台api?)

    HTTP/1.1 302 Found
    Location: https://client.example.com/oauth2?code=SplxlOBeZQQYbYS6WxSbIA&state=wilson

3.拿到授权码以后,在 后端服务,直接向 微信授权服务器 请求令牌

https://xeixin.com/oauth/token?
 client_id=CLIENT_ID&
 client_secret=CLIENT_SECRET&
 grant_type=authorization_code&
 code=AUTHORIZATION_CODE&
 redirect_uri=CALLBACK_URL
Screen Shot 2020-12-08 at 12.06.26 AM.png
e5991fc4f8ac4b46a78293e69605d871.png

案例:https://www.toutiao.com/a6643594372862444040/

2. 授权码 "隐藏式" - implicit

客户端让用户登录授权服务器换token,客户端使用token访问资源(只有客户端,没有服务端)
  • 支持refresh token
  • 使用场景:为web浏览器应用设计。一般简化模式用于没有服务器端的第三方单页面应用,因为没有服务器端就无法使用授权码模式。

https://b.com/oauth/authorize?
  response_type=token&
  client_id=CLIENT_ID&
  redirect_uri=CALLBACK_URL&
  scope=read
Screen Shot 2020-12-08 at 12.06.44 AM.png

3c17a3e57be749228eb9b24db7aab3a3.png

3. 密码式 - password

用户在客户端提交账号密码换token,客户端使用token访问资源
  • 不支持refresh token
  • 使用场景:为遗留系统设计。这种模式十分简单,但是却意味着直接将用户敏感信息泄漏给了client,因此这就说明这种模式只能用于client是我们自己开发的情况下。因此密码模式一般用于我们自己开发的,第一方原生App或第一方单页面应用。
https://oauth.b.com/token?
  grant_type=password&
  username=USERNAME&
  password=PASSWORD&
  client_id=CLIENT_ID
Screen Shot 2020-12-08 at 12.07.01 AM.png

4. 客户端凭证 - Client Credentials Grant

客户端使用自己的标识换token,客户端使用token访问资源
  • 不支持refresh token
  • 使用场景:为后台api服务消费者设计。一般用来提供给我们完全信任的服务器端服务。
https://oauth.b.com/token?
  grant_type=client_credentials&
  client_id=CLIENT_ID&
  client_secret=CLIENT_SECRET
Screen Shot 2020-12-08 at 12.07.20 AM.png
Screen Shot 2020-12-08 at 12.00.59 AM.png
Screen Shot 2020-12-08 at 12.01.18 AM.png

如何在移动App中使用OAuth 2.0?

移动 App 可以分为两类,一类是没有 Server 端的 App 应用,一类是有 Server 端的 App 应用。
这两类 App 在使用 OAuth 2.0 时的最大区别,在于获取访问令牌的方式:

  • 如果有 Server 端,就建议通过 Server 端和授权服务做交互来换取访问令牌;
  • 如果没有 Server 端,那么只能通过前端通信来跟授权服务做交互,比如隐式许可授权类型。当然,这种方式的安全性就降低了很多。也可以将一个“迷你”的 Web 服务器嵌入到 App 里面去,这样就可以像 Web 应用那样来使用 OAuth 2.0 。这样的 App 通过监听运行在 localhost 上的 Web 服务器 URI,就可以做到跟普通的 Web 应用一样的通信机制。
    这里介绍另外一种 PKCE 协议,全称是 Proof Key for Code Exchange by OAuth Public Clients。在下面的流程图中,为了突出第三方软件使用 PKCE 协议时与授权服务之间的通信过程,我省略了受保护资源服务和资源拥有者的角色:
66648bff2d955b3d714ce597299fbf52.png

首先,App 自己要生成一个随机的、长度在 43~128 字符之间的、参数为 code_verifier 的字符串验证码;接着,我们再利用这个 code_verifier,来生成一个被称为“挑战码”的参数code_challenge。那怎么生成这个 code_challenge 的值呢?OAuth 2.0 规范里面给出了两种方法,就是看 code_challenge_method 这个参数的值:

  • 一种 code_challenge_method=plain,此时 code_verifier 的值就是 code_challenge 的值;
  • 另外一种 code_challenge_method=S256,就是将 code_verifier 值进行 ASCII 编码之后再进行哈希,然后再将哈希之后的值进行 BASE64-URL 编码,如下代码所示。
code_challenge = BASE64URL-ENCODE(SHA256(ASCII(code_verifier)))

在第一步获取授权码 code 的时候,我们使用 code_challenge 参数。需要注意的是,我们要同时将 code_challenge_method 参数也传过去,目的是让授权服务知道生成 code_challenge 值的方法是 plain 还是 S256。

https://authorization-server.com/auth?
response_type=code&
app_id=APP_ID&
redirect_uri=REDIRECT_URI&
code_challenge=CODE_CHALLENGE&
code_challenge_method=S256

在第二步获取访问令牌的时候,我们使用 code_verifier 参数,授权服务此时会将 code_verifier 的值进行一次运算。那怎么运算呢?就是上面 code_challenge_method=S256 的这种方式。
没错,第一步请求授权码的时候,已经告诉授权服务生成 code_challenge 的方法了。所以,在第二步的过程中,授权服务将运算的值跟第一步接收到的值做比较,如果相同就颁发访问令牌。

POST 
https://api.authorization-server.com/token?
grant_type=authorization_code&
code=AUTH_CODE_HERE&
redirect_uri=REDIRECT_URI&
app_id=APP_ID&
code_verifier=CODE_VERIFIER

现在,你就知道了我们是如何使用 code_verifier 和 code_challenge 这两个参数的了吧。总结一下就是,换取授权码 code 的时候,我们使用 code_challenge 参数值;换取访问令牌的时候,我们使用 code_verifier 参数值。

Keycloak介绍

Keycloak是为现代应用和服务提供了开源IAM(Identity and Access Management)解决方案
https://www.keycloak.org/

openid/AppAuth-Android

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容

  • 上一篇文章[http://www.ruanyifeng.com/blog/2019/04/oauth_design...
    笔名辉哥阅读 3,072评论 0 55
  • 上一篇文章介绍了 OAuth 2.0 是一种授权机制,主要用来颁发令牌(token)。本文接着介绍颁发令牌的实务操...
    haokeed阅读 450评论 0 0
  • 其实微服务分布式认证授权框架并不复杂,网上的一些文章也是过于注重实践,却对这其中的原理解释不多,希望我的这篇文章能...
    程序员王旺阅读 5,061评论 0 3
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,495评论 16 22
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,551评论 0 11