blog
blog copied to clipboard
Golang: Authentication Design
related:
- #140 : Authorization 方案
- #365
- #381
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:
- oauth2 vs jwt: https://stayhungrystayfoolish.github.io/JWT-OAuth2-Compare/
- OAuth 2和JWT - 如何设计安全的API?
- 关于 RESTFUL API 安全认证方式的一些总结
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
oauth2:
-
参考: https://www.ory.sh/docs/hydra/#introduction-to-oauth-20-and-openid-connect
- 详细解释.
-
标准协议: https://tools.ietf.org/html/rfc6749#section-1.2
角色:
- 资源拥有者(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中有三方:
- 用户;
- Consumer(不知杂翻译,类似上面的 twitterfeed 角色);
- 服务提供商(如上例的twitter角色)。
适用场景:
- OAuth 2.0和Hydra适合您,这个非排他性列表可能会帮助您做出决定。
- 如果您希望允许第三方开发人员现在或将来访问您的API,那么Hydra非常适合。这就是OAuth2提供商所做的事情。
- 如果您想成为一个身份提供商,如谷歌,Facebook或微软,OpenID Connect和Hydra是完美的选择。
- 运行OAuth2提供程序适用于浏览器,移动和可穿戴应用程序,因为您可以随时避免在设备,电话或可穿戴设备上存储访问凭据并撤消访问令牌,从而访问权限。
- 如果您有很多服务并希望限制这些服务的自动访问(思考:cronjobs),OAuth2可能对您有意义。示例:在获取最新的用户配置文件更新时,不允许注释服务读取用户密码。
hydra:
-
https://www.ory.sh/
-
https://github.com/ory/hydra
-
oauth2 server
功能:
- 支持 acl
docs:
- 5分钟本地demo测试: https://www.ory.sh/docs/hydra/5min-tutorial
示例:
- https://github.com/ory/examples
keto:
- 权限控制
SDK 示例:
- https://www.ory.sh/docs/keto/sdk/api
- API 示例返回值
ACL:
-
https://www.ory.sh/docs/keto/engines/acl
-
优点:
精细控制,可根据身份和权限进行微调。 在每个身份具有不同权限集的系统中都能很好地工作。
- 不足之处:
随着更多身份和资源的增加,矩阵变得越来越大,变得越来越难以维护。 如果您有许多允许执行相同操作的身份,请选择RBAC之类的系统。
RBAC:
- https://www.ory.sh/docs/keto/engines/rbac
- 优点:
在许多身份共享相同权限的情况下,降低管理复杂性。 使用角色层次结构使管理更加轻松。 许多开发人员已经很好地建立并且易于理解,因为它是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
{
"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/*"
]
}]
}
aws
aws 单点登录 (SSO) 服务:
- AWS Single Sign-On
- https://docs.aws.amazon.com/zh_cn/singlesignon/latest/userguide/what-is.html
oathkeeper:
- https://www.ory.sh/docs/oathkeeper/
- ORY Oathkeeper是一个反向代理,它根据一组规则(称为“访问规则”)评估传入的HTTP请求。
- ORY Oathkeeper实现的功能集在BeyondCorp和ZeroTrust的上下文中称为身份和访问代理(IAP)。
hydra:
教程:
# 安装:
go get -u -v github.com/ory/hydra
- 示例启动: https://www.ory.sh/docs/hydra/5min-tutorial