OAuth 2.0受权之受权码受权

  OAuth 2.0 是一个开放的标准协议,容许应用程序访问其它应用的用户受权的数据(如用户名、头像、昵称等)。好比使用微信、QQ、支付宝登陆等第三方网站,只须要用户点击受权按钮,第三方网站就会获取到用户在微信、QQ、支付宝的信息(固然信息都是不敏感数据如用户名、头像、昵称等),获取这些信息后,第三方网站就能够用这些信息建立一个第三方用户帐户,不须要再用户手动填写用户名、头像、昵称等......要想了解这个受权过程,咱们须要想了解什么是OAuth 2.0.api

OAuth 2.0类型

  在OAuth 2.0中"受权类型"指的是应用程序获取令牌的方式。OAuth 2.0定义了若干受权类型,有Authorization Code(受权码)、Implicit(隐式受权)、Password(密码受权)、Client Credentials(客户端凭证)、Device Code(设备代码)、Refresh Token(刷新令牌)。根据每种受权的应用场景选择不一样的受权。每种受权类型都针对特定用例进行了优化,不管是Web应用程序,本机应用程序,没法启动Web浏览器的设备或服务器到服务器应用程序。对于网站、手机app受权,如今用的最普遍的就是受权码受权。浏览器

受权码受权

  受权码与其余受权类型不一样点是,它说先要求应用程序启动浏览器来开始流程。受权的大体流程以下:安全

  • 应用程序打开浏览器,将网页转到OAuth服务器。(如用微博登陆豆瓣,会跳转到微博受权页面。)
  • 用户看到受权提示,而后赞成给应用受权。(用户点击受权按钮,赞成给豆瓣受权用户的微博信息。)
  • 用户会重定向到应用程序,而且在返回的网址中带了受权码。(点击受权按钮后,会回到豆瓣,在网址中会带有Code.)
  • 应用程序经过Code去获取access token.

第一步、获取用户的受权

  首先应用程序须要构造一个URL,URL的结构以下:https://authorization-server.com/auth?response_type=code&client_id=29352915982374239857&redirect_uri=https%3A%2F%2Fexample-app.com%2Fcallback&scope=create+delete&state=xcoiv98y2kd22vusuye3kch服务器

  • response_type:这是告诉受权服务器,返回类型,code表示受权码受权。
  • client_id:应用程序的公共标识符。
  • redirect_uri:告诉受权服务器在用户批准受权后,将获取的Code发送到哪里。
  • scope:应用受权做用域(如微信,当scope=snsapi_base时,只能获取用户的openId。当scope=snsapi_userinfo时,能够获取昵称、性别、所在地)。
  • state:应用程序传递的一个随机数,用来防止CSRF攻击。

  如豆瓣须要获取微信的受权信息,根据微信文档,拼接这个URL,会重定向到微信受权页面,当用户点击受权时,会返回到redirect_uri对应的值的网址,微信会在网址后面添加上code=CODE&state=STATE。code的值就是微信返回的信息,state是的值是应用程序以前传递的值。微信

第二步、重定向返回应用程序

  应用程序须要接受返回的code。注意code有有效期,而且只能使用一次,微信认证为5分钟过时,支付宝为3分钟到24小时。app

第三步、经过code获取access token

  获取access token应用程序须要经过POST请求并带着下面的参数请求受权服务器。优化

  • grant_type=authorization_code:告诉受权服务器,采用的受权类型是受权码类型。
  • code:获取的code。
  • redirect_uri:重定向网址。此参数不是必须的。
  • client_id:应用程序Id
  • client_secret:安全码。若是没有安全码,每一个应用程序(包括攻击者的应用程序)均可以去获取微信的受权,由于这些参数(除了安全码)均可以拼接。为了安全,当你的应用程序须要微信受权登陆时,申请了微信的应用,微信会给你一个secret。

请求受权服务器后,服务器会返回网站

What is the OAuth 2.0 Authorization Code Grant Type?{ "access_token":"MTQ0NjJkZmQ5OTM2NDE1ZTZjNGZmZjI3", //咱们最终所须要的access token "token_type":"bearer",              //令牌类型 "expires_in":3600,                 //access_token接口调用凭证超时时间,单位(秒) "refresh_token":"IwOGYzYTlmM2YxOTQ5MGE3YmNmMDFkNTVk", //当access token超时失效后,须要用refresh token来再次获取access token "scope":"create delete"               //应用受权做用域 }
受权流程到此就结束了。
参考:
相关文章
相关标签/搜索