官网这样说...php
An open protocol to allow secure authorization in a simple and standard method from web, mobile and desktop applications.web
OAuth 1.0 协议过于复杂,易用性差,因此并无获得普及,下文中给出了受权的流程图,能够简单了解了解,如今不多有用的了。浏览器
OAuth Authentication Flow安全
关于OAuth 1.0, 想了解的能够看看这些:服务器
OAuth 2.0是目前的最新版本,OAuth 2.0不兼容OAuth 1.0。这篇文章主要讲讲OAuth 2.0,并以此展开。网络
先来讲一个场景:好比你第一次打开简书官网,想要注册一个帐号。你会看到简书容许你经过新浪微博帐号登录。当你点击以后,须要你登录微博。以后会出现“是否赞成简书获取你的我的信息”等等,若是你选择受权,以后会跳转回简书。你会发现你在简书的用户名就是你微博的用户名。而后,你会发出一条新的微博好比“我加入了简书,一个基于内容分享的社区!”(这只是举个例子,不知道简书有没有这样作)。app
好了,这回开始进入正题ide
OAuth 2.0 定义了四个角色:网站
资源拥有者(Resource Owner)
资源拥有者其实就是用户(user),用户将会受权一个第三方应用能够获取他们的帐户资源。固然第三方应用程序对于用户帐户的操做是有限制的(好比,read access, read and write access)!这个限制就是用户受权时给予的权限范围(scope)
上面场景中,微博帐户就是资源拥有者。read access就好比读取微博用户名,write access就好比以你的名义发了一个微博。spa
客户端(Client)
客户端就是前面说的第三方应用程序,他们想要获取用户的帐户资源,但在这么作以前必须通过受权
上面场景中,简书就是客户端
资源服务器(Resource Server)
资源服务器存放用户帐户以及帐户信息和资源
上面场景中,新浪微博就是资源服务器,同时也是受权服务器
受权服务器(Authorization Server)
受权服务器验证用户身份,并为第三方应用程序颁发受权令牌(access token)
资源服务器与受权服务器能够是同一台服务器,这里分开主要是便于解释清楚OAuth协议。从程序开发者的角度,这两个都是service's API会执行的事情。
在了解完OAuth中的四个角色以后,咱们看看这四个角色之间是如何互动的。下面是基本运行流程。
Abstract Protocol Flow
对于一个应用程序来讲,若是它想要使用OAuth,那么首先它要在服务提供商那里注册。通常出如今网站的“developer”或者“API”部分。
应用程序要提供:
在用户赞成受权(或者拒绝)以后,服务提供商会将用户从新导向这个Callback URL,这个Callback URL要来负责处理受权码或者访问令牌。
应用程序注册完成以后,服务提供商会颁发给应用程序一个“客户端认证信息(client credentials)”。Client Credential包括:
OAuth 2.0 定义了四种受权模式:
Authorization Code Flow
第一步:客户端把用户代理定向到受权终端(Authorizaiton Endpoint)
https://www.example.com/v1/oauth/authorize?response_type=code&client_id=CLIENT_ID&redirect_uri=CALLBACK_URL&scope=read
第二步:用户受权应用程序
用户点击上述URI以后,用户首先要登录,证实其身份。而后选择赞成受权应用程序能够访问他们的帐户或者拒绝。
是否容许简书访问你的微博帐户
第三步:应用程序获取受权码
若是用户赞成受权,服务提供商会将用户代理重定向到第一步中的redirect_uri,而且会包含受权码。
https://www.jianshu.com/callback?code=AUTHORIZATION_CODE
第四步:应用程序请求受权令牌
应用程序向API token终端发送刚刚得到的受权码,以及认证信息。
https://www.example.com/v1/oauth/token?client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=CALLBACK_URL
URI中包括:
第五步:应用程序得到受权令牌
若是上一步验证有效,API将返回一个HTTP回复。
{"access_token":"ACCESS_TOKEN","token_type":"bearer","expires_in":2592000,"refresh_token":"REFRESH_TOKEN","scope":"read"}
HTTP回复中包含:
Implicit Flow
第一步:客户端把用户代理定向到受权终端(Authorizaiton Endpoint)
https://www.example.com/authorize
token
而不是code
https://www.example.com/authorize?response_type=token&client_id=CLIENT_ID&redirect_uri=CALLBACK_URL&scope=read
第二步:用户受权应用程序
用户点击上述URI以后,用户首先要登录,证实其身份。而后选择赞成受权应用程序可访问他们的帐户或者拒绝。
是否容许简书访问你的微博帐户
第三步:用户代理收到受权令牌
假设用户赞成受权,受权服务器重定向用户代理到第一步提到的redirect_uri。并在URI fragment中包含受权令牌(但不能查看)。
https://www.example.com/callback#token=ACCESS_TOKEN
第四步:用户代理向资源服务器发出请求
用户代理依照重定向的指令,向资源服务器发出请求,但并不包含上一步中获得的受权令牌(#后面的部分)。用户代理将完整的重定向URI保存在本地。
第五步:资源服务器返回一个网页
资源服务器会返回一个网页(一般是一个HTML文件内嵌一段脚本)。这段内嵌的脚本(script)能够访问第三步中用户代理保存在本地的完整的重定向URI,并从中提取受权令牌。
第六步:用户代理提取受权令牌
用户代理执行上面提到的脚本,提取出受权令牌。而后将受权令牌传递给应用程序。
Password Credentials Flow
第一步:用户传递认证信息
用户将用户名和密码交给应用程序。
第二步:应用程序请求受权令牌
https://www.example.com/token
password
,前面提到的两种分别是code
和token
。https://www.example.com/token?grant_type=password&username=USERNAME&password=PASSWORD&client_id=CLIENT_ID
第三步:受权服务器返回受权令牌
若是用户的认证信息获得验证,受权服务器将向应用程序返回受权令牌。
Client Credentials Flow
第一步:应用程序请求受权令牌
https://www.example.com/token
client_credentials
,前面提到的两种分别是code
、token
和password
。https://www.example.com/token?grant_type=client_credentials&client_id=CLIENT_ID&client_secret=CLIENT_SECRET
第二步:受权服务器返回受权令牌
受权服务器验证认证信息,向应用程序返回受权令牌。
Invalid Token Error
refresh_token
https://www.example.com/v1/oauth/token?grant_type=refresh_token&client_id=CLIENT_ID&client_secret=CLIENT_SECRET&refresh_token=REFRESH_TOKEN