授权码授权总共由2个请求和2个响应组成。一个授权请求+响应,和一个令牌请求+响应。 授权请求 授权请求被发送到授权端点以获取一个授权码。这是请求中用到的参数:
response_type | 必须。必须被设置到代码里 |
client_id | 必须。当客户端被注册时,授权服务器要标识的客户端。 |
redirect_uri | 可选。通过客户端注册的重定向URI。 |
scope | 可选。请求可能的作用域。 |
state | 可选(推荐的)。任何需要被传递到客户端请求的URI客户端的状态。 |
授权码授权总共由2个请求和2个响应组成。一个授权请求+响应,和一个令牌请求+响应。 授权请求 授权请求被发送到授权端点以获取一个授权码。这是请求中用到的参数:
response_type | 必须。必须被设置到代码里 |
client_id | 必须。当客户端被注册时,授权服务器要标识的客户端。 |
redirect_uri | 可选。通过客户端注册的重定向URI。 |
scope | 可选。请求可能的作用域。 |
state | 可选(推荐的)。任何需要被传递到客户端请求的URI客户端的状态。 |
当客户端应用请求授权和访问令牌时,它发送http请求到授权服务器,同它的授权和令牌端点。被发送来回的请求和响应取决于授权类型。记住,这四种授权类型:
OAuth 2.0定义了一系列端点。端点典型的就是web服务器上的URI。比如,一个Java Servlet, JSP page, PHP page, ASP.NET网页等等。
这些端点定义有:
授权端点和令牌端点都位于授权服务器上,重定向端点位于客户端应用上。每个端点都会在下面讲述。
当一个客户端应用想要访问拥有者托管在资源服务器的资源时,它必须先获得授权,本节将讲述客户端如何获取授权。
客户端标识,客户端密钥和重定向URI
在客户端应用能请求访问资源服务器的资源之前,客户端应用程序,必须先在资源服务器相关联的授权服务器中进行注册。
注册一个一次性的任务。一旦注册了,除非客户端注册被取消了,注册将持续有效。
注册后客户端应用将由授权服务器分配客户端标识和密钥。在授权服务器上,客户端标识和密钥是唯一标识客户端应用的。如果客户端应用注册了多个授权服务器(如Facebook, Twitter和Google等),每一个授权服务器将发出唯一的标识给该客户端应用。
无论什么时候客户端应用,想要访问同样资源服务器上的资源,它都需要通过发送客户端标识和密钥到授权服务器来验证自己。
在注册过程中,客户端应用也注册了一个重定向URI,当资源拥有者授权给客户端应用时,该重定向URI会被使用。当资源拥有者成功的通过授权服务器授权给客户端应用时,资源拥有者被重定向回客户端应用,再跳转到该重定向URI。
OAuth 2.0客户端角色被细分为一系列类型和配置,本节将阐述这些类型和配置。
OAuth 2.0规范定义了两种客户端类型:
保密的客户端能够对外部保持客户端密码保密。该客户端密码是由授权服务器分配给客户端应用的。为了避免欺骗,该密码是授权服务器用来识别客户端的。例如一个保密的客户端可以是web应用,除了管理员,没有任何人能够访问服务器和看到该密码。
公有的客户端不能使客户端密码保密。比如移动手机应用或桌面应用会将密码嵌入在内部。这样的应用可能被破解,并且泄漏密码。这同于在用户的浏览器上运行的JavaScript应用。用户可以使用一个JavaScript调试器来寻找到应用程序,并查看客户端密码。
资源拥有者是指拥有共享数据的人或应用。比如Facebook或者Google的用户就是是资源拥有者,他们拥有的资源就是他们的数据。资源拥有者在上图中被描述为人,这也是最常见的情况。但资源拥有者也可以是一个应用。OAuth 2.0规范中包含这两种可能性。
资源服务器是指托管资源的服务器。比如,Facebook或Google就是资源服务器(或者有一个资源服务器)。
如引言所说的,OAuth 2.0是一个能够使应用彼此访问数据的开放授权协议,这里我们将阐述该协议是怎么工作的以及规范中提到的概念。该图说明了整个授权过程:
OAuth 2.0是一个应用之间彼此访问数据的开源授权协议。比如,一个游戏应用可以访问Facebook的用户数据或者一个基于地理的应用可以访问Foursquare的用户数据等。
在使用sql查询中,经常需要去重,去重分两种,一种比较简单的是整条数据都重复,直接使用distinct关键字就可以搞定,如:
select distinct user_name from log
这样可以将log表中所有的user_name取出来,并不会出现重复,
但是如果要同时多查一些其他字段,distinct就不好使了,如:
本文主要针对URI编解码的相关问题做了介绍,对Url编码中哪些字符需要编码、为什么需要编码做了详细的说明,并对比分析了Javascript中和编解码相关的几对函数escape / unescape,encodeURI / decodeURI和encodeURIComponent / decodeURIComponent。
foo://example.com:8042/over/there?name=ferret#nose
\_/ \______________/ \________/\_________/ \__/
| | | | |
scheme authority path query fragment
URI是统一资源标识的意思,通常我们所说的Url只是URI的一种。典型Url的格式如上面所示。下面提到的Url编码,实际上应该指的是URI编码。