开发学习:身份认证:OAuth 2.0粗解
前言
学习和了解OAuth认证授权机制。OAuth是用的比较多的身份认证,资源授权机制,微信和企业微信。
很多使用场景,很多第三方应用支持使用微信和Google账户(拥有大量用户账户资源等)登录他们的服务和应用,用户不要额外申请和注册账户。这当中使用的就是OAuth 2.0授权机制。
正文
OAuth授权工作流
看到阮一峰的博客这里 画了一个图,不知道对不对。
用户(浏览器)使用和访问第三方服务(网站或应用。(第三方服务支持Google账户/Apple账户登录)
第三方服务返回(return 302/301) 并重定向用户(浏览器)到用户的认证服务器。(携带第三方的Callback回调url)
3、用户登录自己的身份认证服务器,认证服务器会询问用户是否授权第三方服务访问自己的账户信息(资源),例如邮件地址/ID/头像等。
用户授权后,用户的账户认证服务器返回授权码并重定向用户(浏览器)到第三方服务(携带。
用户(浏览器)被重定向后会携带授权码给第三方服务。
第三方服务(一般是后端)接收到授权码,由第三方的后端提交申请,申请带上授权码/Client_ID/Client_Secret到用户的认证服务器。用户(浏览器)不可见。
用户的认证服务器验证后,颁发access token,以json形式返回。
第三服务(后端)收到token后,带上token(http header里的authorization字段)访问用户的资源(例如email/ID等)
资源服务器返回用户资源给第三方服务。
使用场景和案例
场景1
现在很多网站支持使用Google账户/微信第三方账户等登录他们的服务,就是oAuth的实现。如下图:
场景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/1447723
- Google OAuth
https://console.cloud.google.com/apis/credentials
开发文档:
https://developers.google.com/identity/protocols/oauth2/web-server