p; `refresh_token` VARCHAR(40) NOT NULL, `client_id` VARCHAR(80) NOT NULL, `user_id` VARCHAR(255), `expires` TIMESTAMP NOT NULL, `scope` VARCHAR(2000), CONSTRAINT refresh_token_pk PRIMARY KEY (refresh_token) );
-- CREATE TABLE `user` ( `user_id` INT(11) NOT NULL AUTO_INCREMENT, `username` VARCHAR(255) NOT NULL, `password` VARCHAR(2000), `first_name` VARCHAR(255), `last_name` VARCHAR(255), CONSTRAINT user_pk PRIMARY KEY (user_id) ); -- test data INSERT INTO oauth_client (client_id, client_secret, redirect_uri) VALUES ("testclient", "testpass", "http://fake/"); INSERT INTO user (username, password, first_name, last_name) VALUES ('rereadyou', '8551be07bab21f3933e8177538d411e43b78dbcc', 'bo', 'zhang');
第二部分: 认证方案及实现
OAuth2 RFC 6749 规范提供了四种基本认证方案,以下针对这四种认证方案以及它们在本实现中的使用方式进行分别说面。
第一种认证方式: Authorization Code Grant (授权码认证)
授权码通过使用授权服务器做为客户端与资源所有者的中介而获得。客户端不是直接从资源所有者请求授权,而是引导资源所有者至授权服务器(由在RFC2616中定义的用户代理),授权服务器之后引导资源所有者带着授权码回到客户端。
在引导资源所有者携带授权码返回客户端前,授权服务器会鉴定资源所有者身份并获得其授权。由于资源所有者只与授权服务器进行身份验证,所以资源所有者的凭据不需要与客户端分享。
授权码提供了一些重要的安全益处,例如验证客户端身份的能力,以及向客户端直接的访问令牌的传输而非通过资源所有者的用户代理来传送它而潜在暴露给他人(包括资源所有者)。
授权码许可类型用于获得访问令牌和刷新令牌并未机密客户端进行了优化。由于这是一个基于重定向的流程,客户端必须能够与资源所有者的用户代理(通常是Web浏览器)进行交互并能够接收来自授权服务器的传入请求(通过重定向)。
Authorization Code Grant 过程(又称为 Web Server Flow) 参见如下: +----------+ | Resource | | Owner | | | +----------+ ^ | (B) +----|-----+ Client Identifier +---------------+ | +----(A)-- & Redirection URI ---->| | | User- | | Authorization | | Agent +----(B)-- User authenticates --->| Server | | | &n |