authentication 认证访问 VS  authorization 访问权限

authentication(认证) 一般包含两个步骤:

第一步,用户需要安装服务提供的授权证书,或者用户需要使用API服务中已经存储的某个账户,也可以创建一个;

第二步,每次发送请求到API服务时需要带上证书,因为RESTful API 是不会记录客户端与服务端的会话,无状态限制。

有些认证技术还涉注册,客户端需要安装证书,并且按需要安装用户个人的证书,客户端需要将客户端的证书和用户证书一起携带发送请求。

 

Authentication vs. authorization

It is easy to confuse authentication with another element of the security plan: authorization.

While authentication verifies the user’s identity, authorization verifies that the user in question has the correct permissions and rights to access the requested resource.

As you can see, the two work together. Authentication occurs first, then authorization.

 

常见的认证方式有如下几种方式:

1、用户名 + 密码

用户名密码授权,是最常见的授权认证方式,例如:

1)打开电脑,输入用户名、密码,开机登录

2)连接腾讯云,输入IP,Port,用户名、密码,远程登录

3)使用米扑代理,需要授权使用代理IP,输入 用户名、密码 

米扑代理授权界面:https://proxy.mimvp.com/usercenter/userinfo.php?p=whiteip

 

2、白名单IP

白名单IP授权,也是很常见的,一般是外网或内网的一个或多个IP地址,也可以是一个或多个IP段(IP域)

白名单IP授权,跟用密授权一样,也是应用很广的,其优点免去了输入用户名 + 密码的繁琐,简单、方便。

但对于IP地址经常变化的,不方便于白名单IP授权,需要经常变更IP地址

应用场景:米扑代理的授权,就包含白名单IP,详见:米扑代理 - 白名单IP(授权)

 

3、Basic Authentication

HTTP Basic authentication is described in RFC 2617. It’s a simple username/password scheme.

将用户名与密码进行Base64转码,但这种转码是可逆可破解的,安全性不高,可用于 Nginx 访问授权,详见米扑博客:Nginx 配置文件添加 http 授权

某些爬虫工具可能会获取这些请求信息,直接获取用户的账号和密码,如果采用HTTPS方式发送请求,每次请求和响应会被SSL加密,爬虫无法获取这些信息。

另一个问题,由于API通常不能信任用户使用的客户端,如果用户在多个设备(平板、电脑、手机)中登录了这个API服务,其中一个设备出现安全问题,需要修改密码,那么其他设备也需要重新登录才行。为了解决第二个问题,需要对每个设备给予不同的证书

 

4、OAuth

OAuth 是一种授权框架,能够让应用通过HTTP 服务获取有限的访问,委托认证服务授权第三方应用访问自己的账号信息,例如 Facebook、Google、GitHub、DigitalOcean、QQ、微信、支付宝等都采用该技术。

OAuth2 相比OAuth 1,可以在PC端、移动端设备上使用。

OAuth 定义了四种角色: 

1. 资源所属者,User, 拥有该资源的人,拥有Application所访问资源的权限。 
2. 客户端, Application, 需要访问用户账号信息的应用 
3. 资源服务器,API 
4. 授权服务器,API

OAuth 抽象版流程图 

OAuth 授权实例流程图(点击看大图

在应用(Application/Client)使用OAuth前需要在Service API 注册该应用。需要在Service中提交应用的信息:名称、网站、授权后的跳转URL。

当应用注册后,Service会发布“client credentials”客户端证书,包括client identifier 和 client secret.

Client ID 是公开的字符串,提供ServiceAPI标识该应用,并且用来构建呈现给用户的授权URLs。

Client Secret用来认证Application向ServiceAPI的发起访问用户账号信息的请求,需要确保Application与API之间的隐私。

Authorization Grant (权限授予方式) 在上图的第一步中有权限授予操作。

OAuth2 提供四种授予权限的方式,根据不用场景使用: 

1. Authorization Code: 在服务端应用采用 
2. Implicit: 移动端APP,Web应用 
3. Resource Owner Password Credentials: 在可信任的应用中使用 
4. Client Credential:应用访问API采用的

Authorization Code Flow 

第一步,用户 访问授权请求的链接,例如

https://cloud.digitalocean.com/v1/oauth/authorize?response_type=code&client_id=CLIENT_ID&redirect_uri=CALLBACK_URL&scope=read 

链接包含五个信息:

  1. API 授权点
  2. client_id: client_id,
  3. redirect_uri=CALLBACK_URL
  4. response_type=code, 指定应用的授权的方式,采用authorization code grant 方式
  5. scope=read. 指定访问的等级

第二步,授权应用后,会获取authorization code 

第三步,根据code换取 token

 

5、Token Authentication

JWT( JSON Web Token), 是一种以Base64编码json对象的token,加密,紧凑且自成一体(self-contained),用于在网络中两个节点之间传递信息。

JWT官网:https://jwt.io/introduction

开源标准(RFC 7519

JWT由三个部分组成: 

1. Header, 定义加密算法类型(例如:HS256)、定义类型(JWT) 

2. Payload, 定义token携带的主要信息 

3. Signature, 创建token的签名,

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

 

6、OpenID

OpenID 是一个以用户为中心的数字身份识别框架,去中心化的网上身份认证系统,它具有开放、分散性。

对于支持OpenID的网站,用户不需要记住像用户名和密码这样的传统验证标记。取而代之的是,他们只需要预先在一个作为OpenID身份提供者(identity provider, IdP)的网站上注册。OpenID是去中心化的,任何网站都可以使用OpenID来作为用户登录的一种方式,任何网站也都可以作为OpenID身份提供者。OpenID既解决了问题而又不需要依赖于中心性的网站来确认数字身份。

OpenID正在被越来越多的大网站采用,比如作为身份提供者的AOL和Orange。OpenID可以和.NET Framework的Windows CardSpace一起使用。

OpenID 的创建基于这样一个概念:我们可以通过 URI (又叫 URL 或网站地址)来认证一个网站的唯一身份,同理,我们也可以通过这种方式来作为用户的身份认证。

参考: 

https://oauth.net/articles/authentication/ 

https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2  《RESTful Web API》

腾讯开放平台:获取用户OpenID

 

 

参考推荐

鉴权认证方案总结(登录、API 接口、第三方授权)

Nginx 配置文件添加 http 授权

开放平台中 OAuth 鉴权的实现

前后端 API接口常见的几种鉴权方式

认证(authentication)和授权(authorization)的几种方式总结

API 接口的参数加密签名设计思路(参数加密+超时处理+私钥验证+Https)

JumpServer 堡垒机环境搭建详解

LastPass 跨平台密码管理工具

10多款支持二次验证的网络服务

https SSL 免费证书服务申请

ssh + sshpass 自动输入密码登录服务器

Nginx 反向代理和负载均衡部署

正向代理、反向代理、透明代理的图文详解

Nginx 反向代理及示例

nginx 反向代理转发邮件的配置

自建服务器解决外网访问内网的端口穿透映射