分享

OAuth2 单点登录

 昵称71011036 2020-08-10

简介:OAuth(Open Authorization)是一个开放标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方应用。OAuth2是OAuth协议的延续版本,OAuth1已经被废弃,现在OAuth2是用于授权的行业标准协议。

1. 四个角色

  A. 客户端(client):本身不存储资源,需要通过资源拥有者的授权去请求资源服务器的资源,比如浏览器或内部服务;

  B. 资源拥有者(Resource Owner):通常为用户,也可以是应用程序,他有访问资源的账号和秘钥;

  C. 认证服务器(Authorization Server):用于服务提供商对资源拥有的身份进行认证、对访问资源进行授权,认证成功后会给客户端发放令牌access_token,作为客户端访问资源服务器的凭据;

  D. 资源服务器(Resource  Server):拥有受保护的资源,如果请求包含正确的令牌,那就可以访问资源,比如提供客户端API的服务。

  注意:服务提供商给接入方的身份凭据是:client_id(客户端标识) + client_secret(客户端秘钥),用于不能随便一个请求就能认证授权。

2. 运行流程

  A. 客户端请求第三方授权;

  B. 资源拥有者同意给客户端授权;

  C. 客户端获取到授权码,请求认证服务器申请令牌;

  D. 认证服务器认证授权码无误,同意向客户端发放令牌;

  E. 客户端使用令牌请求资源服务器的资源;

  F. 资源服务器认证令牌无误,同意开放受保护的资源。

3. 授权模式

  A. 授权码模式(Authorization Code)

    流程:

      第一步:用户访问客户端,将会跳转到授权服务器;

      第二步:用户给予是否给客户端授权;

      第三步:若授权的话,授权服务器将跳转到客户端指定的URI,并同时提供授权码;

      第四步:客户端收到授权码,通过返回的URI,向认证服务器申请令牌;

      第五步:认证服务器比对授权码和重定向URI,认证无误后,向客户端发送访问令牌和更新令牌。

    使用场景:该模式是OAuth2最安全最完善的一种模式,可以实现服务之间的调用,比如微信,QQ等第三方登录。

  B. 密码模式(Resource Owner Password Credentials)

    流程:

      第一步:将用户名和密码提供给客户端;

      第二步:客户端携带用户名和密码发送给认证服务器申请令牌;

      第三步:认证服务器认证无误,向客户端提供访问令牌。

    使用场景:客户端不得存储密码,通常用在用户对客户端高度信任情况下。

  C. 简化模式(Implicit)

 

  D. 客户端模式(Client Credentials)

    流程:

      第一步:客户端(服务,非用户)向认证服务器进行身份验证,申请令牌;

      第二部:认证服务器认证无误,向客户端提供访问令牌。

    使用场景:A服务本身需要B服务资源,与用户无关。

4. sql语句

-- used in tests that use HSQL
create table oauth_client_details (
  client_id VARCHAR(256) PRIMARY KEY,
  resource_ids VARCHAR(256),
  client_secret VARCHAR(256),
  scope VARCHAR(256),
  authorized_grant_types VARCHAR(256),
  web_server_redirect_uri VARCHAR(256),
  authorities VARCHAR(256),
  access_token_validity INTEGER,
  refresh_token_validity INTEGER,
  additional_information VARCHAR(4096),
  autoapprove VARCHAR(256)
);

create table oauth_client_token (
  token_id VARCHAR(256),
  token LONGVARBINARY,
  authentication_id VARCHAR(256) PRIMARY KEY,
  user_name VARCHAR(256),
  client_id VARCHAR(256)
);

create table oauth_access_token (
  token_id VARCHAR(256),
  token LONGVARBINARY,
  authentication_id VARCHAR(256) PRIMARY KEY,
  user_name VARCHAR(256),
  client_id VARCHAR(256),
  authentication LONGVARBINARY,
  refresh_token VARCHAR(256)
);

create table oauth_refresh_token (
  token_id VARCHAR(256),
  token LONGVARBINARY,
  authentication LONGVARBINARY
);

create table oauth_code (
  code VARCHAR(256), authentication LONGVARBINARY
);

create table oauth_approvals (
    userId VARCHAR(256),
    clientId VARCHAR(256),
    scope VARCHAR(256),
    status VARCHAR(10),
    expiresAt TIMESTAMP,
    lastModifiedAt TIMESTAMP
);


-- customized oauth_client_details table
create table ClientDetails (
  appId VARCHAR(256) PRIMARY KEY,
  resourceIds VARCHAR(256),
  appSecret VARCHAR(256),
  scope VARCHAR(256),
  grantTypes VARCHAR(256),
  redirectUrl VARCHAR(256),
  authorities VARCHAR(256),
  access_token_validity INTEGER,
  refresh_token_validity INTEGER,
  additionalInformation VARCHAR(4096),
  autoApproveScopes VARCHAR(256)
);

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多