blog icon indicating copy to clipboard operation
blog copied to clipboard

Golang: Authentication Design

Open hhstore opened this issue 5 years ago • 8 comments

related:

  • #140 : Authorization 方案
  • #365
  • #381

hhstore avatar Apr 09 '19 06:04 hhstore

Authentication 身份认证

  • 即验证用户的用户名、密码

  • https://www.cloudflare.com/zh-cn/learning/access-management/what-is-authentication/

  • https://github.com/casbin/awesome-auth#golang

SSO(单点登录):

  • https://www.cloudflare.com/zh-cn/learning/access-management/what-is-sso/

token authentication:

  • https://www.cloudflare.com/zh-cn/learning/access-management/token-based-authentication/

JWT:

  • https://go-zero.dev/cn/docs/advance/jwt

方案:

  • ✅ oauth2
  • ✅ jwt

JWT:

  • ✅ https://jwt.io/
  • ✅ https://go-zero.dev/cn/docs/advance/jwt

oauth2:

  • ✅ https://oauth.net/2/
  • ✅ Open Authorization
  • ✅ 协议规范
  • ✅ https://www.cloudflare.com/zh-cn/learning/access-management/what-is-oauth/

ref:

hhstore avatar Apr 09 '19 06:04 hhstore

libs:

  • 用户登录/授权

oauth2:

oauth2 server:

  • https://github.com/ory/hydra

    • 授权验证示例: https://console.ory.sh/cloud/login
  • https://github.com/RichardKnop/go-oauth2-server

  • https://github.com/go-oauth2/oauth2

Keto:

  • ACL 访问控制
  • https://github.com/ory/keto

oauth2 client:

  • https://github.com/golang/oauth2
  • 官方client包

ref:

  • https://hackernoon.com/build-your-own-oauth2-server-in-go-7d0f660732c3
  • https://www.zhihu.com/question/20313385
  • 权限控制设计: https://juejin.im/entry/5a40594b6fb9a04503104f4e

hhstore avatar Apr 09 '19 06:04 hhstore

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 avatar Apr 09 '19 08:04 hhstore

hydra:

  • https://www.ory.sh/

  • https://github.com/ory/hydra

  • oauth2 server

功能:

  1. 支持 acl

docs:

  • 5分钟本地demo测试: https://www.ory.sh/docs/hydra/5min-tutorial

示例:

  • https://github.com/ory/examples

hhstore avatar Apr 09 '19 08:04 hhstore

keto:

  • 权限控制

SDK 示例:

  • https://www.ory.sh/docs/keto/sdk/api
  • API 示例返回值

ACL:

  • https://www.ory.sh/docs/keto/engines/acl

  • 优点:

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

  • 不足之处:

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

image

RBAC:

  • https://www.ory.sh/docs/keto/engines/rbac

image

  • 优点:

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

  • 不足之处:

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

ORY默认访问控制策略:

  • https://www.ory.sh/docs/keto/engines/acp-ory
  • 在ORY,我们使用以AWS IAM策略建模的访问控制策略DSL。
  • 这些政策定义effect, subject,action,和resource

AWS IAM 访问控制策略:

  • https://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/access_policies.html
  • ACL: https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/acl-overview.html
  • IAM策略示例: https://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/access_policies_examples.html
  • 身份验证和访问控制: https://docs.aws.amazon.com/zh_cn/ram/latest/userguide/control-access.html

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 avatar Apr 09 '19 08:04 hhstore

aws

aws 单点登录 (SSO) 服务:

  • AWS Single Sign-On
  • https://docs.aws.amazon.com/zh_cn/singlesignon/latest/userguide/what-is.html

hhstore avatar Apr 09 '19 09:04 hhstore

oathkeeper:

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

hhstore avatar Apr 09 '19 09:04 hhstore

hydra:

教程:


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



  • 示例启动: https://www.ory.sh/docs/hydra/5min-tutorial

hhstore avatar May 15 '19 06:05 hhstore