oauth2 provider

介绍

OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用

认证过程

  • 使用OAuth进行认证和授权的过程如下所示:
  • 用户访问客户端的网站,想操作自己存放在服务提供方的资源。
  • 客户端向服务提供方请求一个临时令牌。
  • 服务提供方验证客户端的身份后,授予一个临时令牌。
  • 客户端获得临时令牌后,将用户引导至服务提供方的授权页面请求用户授权。在这个过程中将临时令牌和客户端- 的回调连接发送给服务提供方。
  • 用户在服务提供方的网页上输入用户名和密码,然后授权该客户端访问所请求的资源。
  • 授权成功后,服务提供方引导用户返回客户端的网页。
  • 客户端根据临时令牌从服务提供方那里获取访问令牌 。
  • 服务提供方根据临时令牌和用户的授权情况授予客户端访问令牌。
  • 客户端使用获取的访问令牌访问存放在服务提供方上的受保护的资源

oauth2

oauth2

Flow

六种流程:

  • User-Agent Flow 客户端运行于用户代理内(典型如web浏览器)。
  • Web Server Flow 客户端是web服务器程序的一部分,通过http request接入,这是OAuth 1.0提供的流程的简化版本。
  • Device Flow 适用于客户端在受限设备上执行操作,但是终端\a户单独接入另一台电脑或者设备的浏览器
  • Username and Password Flow 这个流程的应用场景是,用户信任客户端处理身份凭据,但是仍然不希望客户端储存他们的用户名和密码,这个流程仅在用户高度信任客户端时才适用。
  • Client Credentials Flow 客户端适用它的身份凭据去获取access token,这个流程支持2-legged OAuth的场景。
  • Assertion Flow 客户端用assertion去换取access token,比如SAML assertion。

其他网站例子:

  • 豆瓣 User-Agent、Web Server、Native Application Username and Password FlowWiki
  • 淘宝 User-Agent、Web Server、Native Application、登陆账号退出流 Username and Password FlowWiki
  • Sina User-Agent(站内应用)、Web Server、Native Application Username and Password FlowWiki

选择:

  • Username and Password Flow(适合官方第一应用)
  • Web Server Flow(适合第三接入,比较常用)

Draft

Ruby Provider 实现

Client Credential Flow:

  • 过程

oauth2

  • 请求参数:

    client_id: 必选参数,应用的唯一标识

    client_secret: 必选参数,应用的唯一标识

    user_name: 用户账号

    user_password: 用户密码

    grant_type: password

  • 例子:

http://server/oauth/token?client_id&client_secret&user_name&user_password 

method: post
  • 返回参数:
{ 		
"access_token":"de6780bc506a0446309bd9362820ba8aed28aa506c71eedbe1c5c4f9dd350e54",
"token_type": "bearer", 
"expires_in": 7200,
"refresh_token":"8257e65c97202ed1726cf9571600918f3bffb2544b26e00a61df9897668c33a1"
}

access_token不再长期有效。在授权获取access_token时会一并返回其有效期,也就是返回值中的expires_in参数。

在access_token使用过程中,如果服务器返回错误:“access_token_has_expired ”,此时,说明access_token已经过期,就需要发送refresh_token的方式来换取新的access_token和refresh_token。

  • 请求参数

    client_id: 必选参数,应用的唯一标识

    client_secret: 必选参数,应用的唯一标识

    grant_type: refresh_token

    refresh_token: refresh_token

  • 例子

    https://server/auth2/token?client_id=0b5405e19c58e4cc21fc11a4d50aae64&client_secret=edfc4e395ef93375&redirect_uri=https://www.example.com/back&grant_type=refresh_token&refresh_token=5d633d136b6d56a41829b73a424803ec
    
    method: post
  • 返回参数
    {
    "access_token":"0e63c03dfb66c4172b2b40b9f2344c45",
    "expires_in":3920,
    "refresh_token":"84406d40cc58e0ae8cc147c2650aa20a",
    }

Rails gem:

  • https://github.com/applicake/doorkeeper
  • https://github.com/nov/rack-oauth2
  • https://github.com/opro/opro
  • https://github.com/songkick/oauth2-provider
  • https://github.com/freerange/oauth2-provider
  • https://github.com/socialcast/devise_oauth2_providable
  • https://github.com/intridea/oauth2

定制我们自己的 JQuery 插件

### 介绍---一直来使用过的 JQuery 插件很多,也写过一些 JQuery 库的扩展。然而要真正了解插件如何扩展 JQuery 库需要对 JavaScript prototype 属性有一些基本的了解。虽然说不直接使用,但是 JavaScript prototype...… Continue reading

HTML INPUT TYPE

Published on July 26, 2015

HTTP 信封里的文档

Published on July 16, 2015