Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Golang: Authentication Design #139

Open
Tracked by #365 ...
hhstore opened this issue Apr 9, 2019 · 8 comments
Open
Tracked by #365 ...

Golang: Authentication Design #139

hhstore opened this issue Apr 9, 2019 · 8 comments

Comments

@hhstore
Copy link
Owner

hhstore commented Apr 9, 2019

related:

@hhstore
Copy link
Owner Author

hhstore commented Apr 9, 2019

oauth2:

image

角色:

  • 资源拥有者(resource owner):能授权访问受保护资源的一个实体,可以是一个人,那我们称之为最终用户;
  • 资源服务器(resource server):存储受保护资源,客户端通过access token请求资源,资源服务器响应受保护资源给客户端;
  • 授权服务器(authorization server):成功验证资源拥有者并获取授权之后,授权服务器颁发授权令牌(Access Token)给客户端。
  • 客户端(client):第三方应用,也可以是它自己的官方应用;其本身不存储资源,而是资源拥有者授权通过后,使用它的授权(授权令牌)访问受保护资源,然后客户端把相应的数据展示出来/提交到服务器。

oauth2 授权模式:

  • 授权码模式
  • 密码模式
  • 客户端模式
  • 简易模式
Authorization code(授权码模式)
标准的 Server 授权模式,非常适合 Server 端的 Web 应用。一旦资源的拥有者授权访问他们的数据之后,他们将会被重定向到 Web 应用并在 URL 的查询参数中附带一个授权码(code)。在客户端里,该 code 用于请求访问令牌(access_token)。并且该令牌交换的过程是两个服务端之前完成的,防止其他人甚至是资源拥有者本人得到该令牌。另外,在该授权模式下可以通过 refresh_token 来刷新令牌以延长访问授权时间,也是最为复杂的一种方式。

Implicit Grant(隐式模式)
该模式是所有授权模式中最简单的一种,并为运行于浏览器中的脚本应用做了优化。当用户访问该应用时,服务端会立即生成一个新的访问令牌(access_token)并通过URL的#hash段传回客户端。这时,客户端就可以利用JavaScript等将其取出然后请求API接口。该模式不需要授权码(code),当然也不会提供refresh token以获得长期访问的入口。

Resource Owner Password Credentials(密码模式)
自己有一套用户体系,这种模式要求用户提供用户名和密码来交换访问令牌(access_token)。该模式仅用于非常值得信任的用户,例如API提供者本人所写的移动应用。虽然用户也要求提供密码,但并不需要存储在设备上。因为初始验证之后,只需将 OAuth 的令牌记录下来即可。如果用户希望取消授权,因为其真实密码并没有被记录,因此无需修改密码就可以立即取消授权。token本身也只是得到有限的授权,因此相比最传统的 username/password 授权,该模式依然更为安全。

Client Credentials(客户端模式)
没有用户的概念,一种基于 APP 的密钥直接进行授权,因此 APP 的权限非常大。它适合像数据库或存储服务器这种对 API 的访问需求。


原理:

OAuth中有三方:

  1. 用户;
  2. Consumer(不知杂翻译,类似上面的 twitterfeed 角色);
  3. 服务提供商(如上例的twitter角色)。

适用场景:

  • OAuth 2.0和Hydra适合您,这个非排他性列表可能会帮助您做出决定。
  1. 如果您希望允许第三方开发人员现在或将来访问您的API,那么Hydra非常适合。这就是OAuth2提供商所做的事情。
  2. 如果您想成为一个身份提供商,如谷歌,Facebook或微软,OpenID Connect和Hydra是完美的选择。
  3. 运行OAuth2提供程序适用于浏览器,移动和可穿戴应用程序,因为您可以随时避免在设备,电话或可穿戴设备上存储访问凭据并撤消访问令牌,从而访问权限。
  4. 如果您有很多服务并希望限制这些服务的自动访问(思考:cronjobs),OAuth2可能对您有意义。示例:在获取最新的用户配置文件更新时,不允许注释服务读取用户密码。

@hhstore
Copy link
Owner Author

hhstore commented Apr 9, 2019

hydra:

功能:

  1. 支持 acl

docs:

示例:

@hhstore
Copy link
Owner Author

hhstore commented Apr 9, 2019

keto:

  • 权限控制

SDK 示例:

ACL:

精细控制,可根据身份和权限进行微调。
在每个身份具有不同权限集的系统中都能很好地工作。

  • 不足之处:

随着更多身份和资源的增加,矩阵变得越来越大,变得越来越难以维护。
如果您有许多允许执行相同操作的身份,请选择RBAC之类的系统。

image

RBAC:

image

  • 优点:

在许多身份共享相同权限的情况下,降低管理复杂性。
使用角色层次结构使管理更加轻松。
许多开发人员已经很好地建立并且易于理解,因为它是Web应用程序的事实标准。

  • 不足之处:

没有背景概念:
没有所有权概念:Dan是文章“Hi World”的作者,因此可以更新它。
没有环境概念:当请求来自IP 10.0.0.3时,允许Dan访问会计服务。
没有租户的概念:Dan被允许访问“dan's test”租户的资源。
...

ORY默认访问控制策略:

AWS IAM 访问控制策略:

image

{
  "Version": "2012-10-17",
  "Id": "S3-Account-Permissions",
  "Statement": [{
    "Sid": "1",
    "Effect": "Allow",
    "Principal": {"AWS": ["arn:aws:iam::ACCOUNT-ID-WITHOUT-HYPHENS:root"]},
    "Action": "s3:*",
    "Resource": [
      "arn:aws:s3:::mybucket",
      "arn:aws:s3:::mybucket/*"
    ]
  }]
}

@hhstore
Copy link
Owner Author

hhstore commented Apr 9, 2019

aws

aws 单点登录 (SSO) 服务:

@hhstore
Copy link
Owner Author

hhstore commented Apr 9, 2019

oathkeeper:

  • https://www.ory.sh/docs/oathkeeper/
  • ORY Oathkeeper是一个反向代理,它根据一组规则(称为“访问规则”)评估传入的HTTP请求。
  • ORY Oathkeeper实现的功能集在BeyondCorp和ZeroTrust的上下文中称为身份和访问代理(IAP)。

@hhstore
Copy link
Owner Author

hhstore commented May 15, 2019

hydra:

教程:


# 安装: 
go get -u -v github.com/ory/hydra



Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant