开发学习:身份认证:OAuth 2.0粗解

tlin82大约 4 分钟Web原创OAuth身份认证令牌java开发框架

前言

学习和了解OAuth认证授权机制。OAuth是用的比较多的身份认证,资源授权机制,微信和企业微信。

很多使用场景,很多第三方应用支持使用微信和Google账户(拥有大量用户账户资源等)登录他们的服务和应用,用户不要额外申请和注册账户。这当中使用的就是OAuth 2.0授权机制。

正文

OAuth授权工作流

看到阮一峰的博客这里open in new window 画了一个图,不知道对不对。

OAuth 2.0 Authorizaztion Flow
OAuth 2.0 Authorizaztion Flow
  1. 用户(浏览器)使用和访问第三方服务(网站或应用。(第三方服务支持Google账户/Apple账户登录)

  2. 第三方服务返回(return 302/301) 并重定向用户(浏览器)到用户的认证服务器。(携带第三方的Callback回调url)

3、用户登录自己的身份认证服务器,认证服务器会询问用户是否授权第三方服务访问自己的账户信息(资源),例如邮件地址/ID/头像等。

  1. 用户授权后,用户的账户认证服务器返回授权码并重定向用户(浏览器)到第三方服务(携带。

  2. 用户(浏览器)被重定向后会携带授权码给第三方服务。

  3. 第三方服务(一般是后端)接收到授权码,由第三方的后端提交申请,申请带上授权码/Client_ID/Client_Secret到用户的认证服务器。用户(浏览器)不可见。

  4. 用户的认证服务器验证后,颁发access token,以json形式返回。

  5. 第三服务(后端)收到token后,带上token(http header里的authorization字段)访问用户的资源(例如email/ID等)

  6. 资源服务器返回用户资源给第三方服务。

使用场景和案例

场景1

现在很多网站支持使用Google账户/微信第三方账户等登录他们的服务,就是oAuth的实现。如下图:

OAuth Example
OAuth Example

场景2

你有一个Web应用程序,例如处理用户相片,支持用户把他的Google相册导入,处理完后存储回去到Google相册。这时,你的应用程序则要访问用户的Google相册,比如要读取或写入到Google相册。这种场景就需要使用Google OAuth。

场景工作原理分析

从以上场景下,各角色时这样的:

  • 你的网站是第三方服务。
  • 微信账户提供商是认证服务商。
  • 用户的微信账户等是用户的资源;
  • 网站要用户授权,才能访问用户的微信账户资源,例如微信,头像或其他微信用户API资源。
  • 网站拿到用户的微信账户资源或用户其他资源(例如相册等)

可以看到,

  • 用户没有把用户和密码提交给第三方服务,安全可以保障。
  • 第三方服务一开始拿到是一个authorization code,然后才是token令牌(有有效期的,用户可以撤销)。
  • 第三方需要带上authorization code和表明自己身份的client_id/client_secret,才能从用户的认证服务商商拿到token. 这个client_id和secret需要第三方服务的开放者事先到身份提供商去备案申请。

OAuth 客户端注册和创建

如果你的网站服务需要支持用户使用Google或微信账户登录,则需要去这些身份提供商备案申请,其实就是申请创建一个身份提供商的OAuth Client客户端,表明身份。

申请时,需要指定你的网站应用程序名和需要的访问权限(例如只读或写入)、资源范围,这些信息将会被身份提供商(API资源)都展示给用户,让用户确认是否授权同意。

  • 微信

https://cloud.tencent.com/developer/article/1447723open in new window

  • Google OAuth

https://console.cloud.google.com/apis/credentialsopen in new window

开发文档:

https://developers.google.com/identity/protocols/oauth2/web-serveropen in new window

OAuth客户端样例
OAuth客户端样例