Skip to content
lele11 edited this page Jul 26, 2013 · 13 revisions

Implementation of OAuth 2.0 in Pi

  • OAuth 系统架构图
  • 系统架构图
  • 系统角色
    • OAuth server:在使用Pi的网站server中,安装OAuth的 Oauth module,网站就可以作为OAuth server 为第三方应用和网站提供OAuth服务。
    • 第三方应用:基于Pi框架的网站,安装OAuth 的consumer module,通过配置,即可作为第三方向OAuth Server请求服务
    • 资源提供方:在本系统中,资源提供方为作为OAuth server的网站的其他模块
  • 系统简介
    • 本系统分为两部分,consumer module和OAuth module,分别作为应用端和server端。
    • OAuth module:基于Pi框架的 OAuth service开发,提供了完整的OAuht服务
    • consumer module:提供第三方使用OAuth服务的接口,是第三方很容易在自己的模块中使用OAuth

Oauth系统功能

系统功能架构图 如下:

功能结构图

Oauth module

模块功能

  • 1.客户端相关功能 提供第三方应用注册,修改信息等功能,注册后会得到client_id 和client_secret 作为第三方身份识别

  • 2.用户授权功能 授权功能支持:authorization Code授权方式,implicit授权方式,clientCredentials授权方式(有限定条件),通过授权功能,第三方应用可以获得access_token和refresheToken

  • 3.授权信息管理功能 为资源提供方提供token验证和授权信息查询,并作为consumer module中某些授权相关功能的处理接口

文件结构

  • clientController
    • registerAction
    • updateAction
    • listAction
  • AuthorizationController
    • indexAction
  • GrantController
    • indexAction
  • TokenController
    • refershAction
    • revokeAction
    • validAction

程序流程

  • AuthorizeController: 用户授权并返回authorization Code或者token

    • indexAction

    程序流程图:

    authorizeController 程序流程图

    第三方应用发起用户授权请求,若需要授权的用户已登录,则跳转到授权确认页,否则,跳转到用户登录页面,当用户登录成功后再跳转到授权确认页。 用户确认授权后,产生授权码,并将授权码以回调地址参数的形式返回,是浏览器自动跳转

    授权功能的访问地址:http://pi.com/oauth/authorization/index/response_type-code/client_id-clientid/redirect_uri-YOUR_REDIRECT_URI/state-RAND_STRING

    参数: response_type :code,请求返回的为授权码 client_id:注册客户端的id,确认客户端身份 redirect_uri:客户端接收授权码,发起token请求的地址,需要经过两次URL转码 state:随机字符串,由客户端产生,响应时作为参数原样返回

    授权流程结束后,浏览器调整到 http://YOUR_REDIRECT_URI?code=CODE&state=RAND_STRING

  • GrantController: 使用Authorization Code 返回access_token,为第三方授权

  • indexAction 第三方获取授权码 code 后,发起申请token的请求,程序通过后,返回包含token信息的Json格式数据

  • ClientController :实现第三方应用的相关功能:注册,信息查看,信息修改功能

  • TokenController: 实现授权管理功能: 授权信息获取,刷新access_token,授权取消

OAuth service in Pi

  • OAuth service 结构逻辑图 oauth service 逻辑图

Clone this wiki locally