一、名词解释
1.AWS(Amazon Web Services)
是全球最全面、应用最广泛的云平台。从全球数据中心提供超过 200 项功能齐全的服务。数百万客户(包括增长最快速的初创公司、最大型企业和主要的政府机构)都在使用 AWS 来降低成本、提高敏捷性并加速创新。
2.云,云计算,云平台,云服务,云存储
逻辑关系:云平台(云计算平台的简称)提供云服务;云服务=云计算+云存储
云:将服务器虚拟化,形成虚拟资源池,相比于以前的物理机更加节省资源成本,便于管理。云是计算、存储、网路资源池化的概念。
云计算:将应用部署到云端后,可以不必再关注那些令人头疼的硬件和软件问题,它们会由云服务提供商的专业团队去解决。使用的是共享的硬件,这意味着像使用一个工具一样去利用云服务(就像插上插座,你就能使用电一样简单)。具有大规模分布式、虚拟化、高可用性和扩展性、按需服务更加经济及安全五大特点。
云服务:常规上是指通过网络以按需、易扩展的方式获得所需服务。简单来说,云服务可以将企业所需的软硬件、资料都放到网络上,在任何时间、地点,使用不同的IT设备互相连接,实现数据存取、运算等目的。
运行时:每种语言的运行时含义有所区别 自己理解在java中 JRE(Java RunTime)= JVM+标准函数类库。C#中 CLR(Common Language RunTime) 主要用于将字节码 这种中间语言(IL)转换为机器语言(有利于实现跨平台)
云平台:可以理解为云计算服务商有N多服务器和存储设备,用信息技术将其整合为一种提供存储服务的平台,这个平台以租赁的方式对外提供服务。
- 公共云:公共云平台是通过 Internet 提供计算资源的第三方提供商。示例包括 Amazon Web Services (AWS)、Google Cloud Platform、阿里巴巴、Microsoft Azure 和 IBM Bluemix。
- 私有云:私有云平台专供单个组织使用。它通常位于现场数据中心或由第三方服务提供商托管。
- 混合云:这是公共和私有云平台的组合。数据和应用程序在两者之间无缝移动。这为组织提供了更大的灵活性,并有助于优化基础架构、安全性和合规性。
云存储:是一个以数据存储和管理为核心的云计算系统。通过集群应用、网格技术或分布式文机房集中监控系统件系统等功能,将网络中大量各种不同类型的存储设备通过应用软件集合起来协同工作,共同对外提供数据存储和业务访问功能的一个系统。云存储设备横向扩展的方式让存储系统具有了无限扩展的能力,能够实现控制器与硬盘的同时扩展,即性能与容量可以同时实现线性扩展,云存储一般可以分为私有云存储、公有云存储。
https://www.zhihu.com/question/297635360/answer/541583179
3.AWS IAM(Amazon Identity and Access Management)
IAM是一种web服务,能够实现安全的控制对亚马逊资源的访问。使用IAM可以控制用户的身份验证(登录)和授权(具有权限)来访问资源。
IAM用户:IAM用户是你在亚马逊中创建的实体,表示与亚马逊互动的人员或服务。IAM用户的主要用途是使人们能够登录到AWS控制台执行交互任务,并能够向使用API或CLI的Amazon服务发出编程请求。可以对用户附加适当的策略,从而授予用户相应的权限。
IAM用户组:IAM用户的集合,你可以为用户组指定权限,以便轻松的管理用户组中用户的权限
IAM角色(职权):与IAM用户类似,它也是一个实体。该实体具有相关操作的权限策略。角色并不能向用户那样能够登录AWS控制台(也就是说它并没有对应的密码和秘钥)。我理解IAM角色的作用:任何人都能通过IAM角色这个实体来使用其对应的权限操作,而并非与某个特定的用户关联。我们对接SPAPI的时候用的是将角色分配给外部应用程序(我们的建的程序)而非IAM登录的联合身份用户。
IAM临时安全凭证:使用Amazon STS(Amazon Security Token Service)创建受信任的临时安全凭证,通过临时安全凭证可以实现你对亚马逊资源的访问。临时安全凭证格式与长期访问秘钥凭证格式相同(都包含accesskeyId和secretkey),只是临时安全凭证在指定的时间后会过时,届时通过其访问亚马逊资源就会失败。
web联合身份验证:
当您编写应用程序时,将向必须使用 Amazon 访问密钥进行签名的 Amazon 服务提出请求。但是,亚马逊不建议应用程序嵌入或分配长期 Amazon 凭证,即使在加密存储中也是如此。相反,让其在需要时使用 Web 联合身份验证 时动态请求临时 Amazon 安全凭证。提供的临时凭证映射到的 Amazon 角色只拥有执行应用程序所需任务的必要权限。
利用 Web 联合身份验证,你不用创建自己的登录代码或管理自己的用户身份。可以使用知名的外部身份提供商(例如,Login with Amazon(LWA)、Facebook、Google 或任何其他 OpenID Connect (OIDC) 兼容的 IDP(内部开发平台Internal Developer Platform))登录。他们可以接收身份验证令牌,然后用该令牌交换 Amazon 中的临时安全凭证,这些凭证映射到有权使用您 Amazon 账户中的资源的 IAM 角色。使用 IDP 可帮助您确保 Amazon 账户的安全,因为你不用在应用程序嵌入和分配长期安全凭证。
总结:
- 向第三方身份提供商注册,获得开发人员的身份。
- 向身份提供商注册您的应用程序。 当您执行此操作时,提供商将提供一个 ID,归您的应用程序专用。亚马逊中appid
- 创建一个或多个 IAM 角色。您需要为每个应用程序的每个身份提供商创建一个角色
IAM FAQ 最好仔细看看联合身份验证 - Michael云擎 - 博客园
IAM策略:策略就是我们日常理解的权限IAM策略分为基于身份的策略(附加到IAM用户、组、角色)和基于资源的策略(附加到资源如:Amazon S3存储桶)
4.OAuth2.0
OAuth定义了四种角色:
- resource owner(资源所有者)
- resource server(资源服务器)
- client(客户端):代表资源所有者并且经过所有者授权去访问受保护的资源的应用程序
- authorization server(授权服务器):在成功验证资源所有者并获得授权后向客户端发出访问令牌
抽象的OAuth2.0流程如图所示:
- (A) 客户端向资源所有者请求其授权
- (B) 客户端收到资源所有者的授权许可,这个授权许可是一个代表资源所有者授权的凭据
- (C) 客户端向授权服务器请求访问令牌,并出示授权许可
- (D) 授权服务器对客户端身份进行认证,并校验授权许可,如果都是有效的,则发放访问令牌
- (E) 客户端向资源服务器请求受保护的资源,并出示访问令牌
- (F) 资源服务器校验访问令牌,如果令牌有效,则提供服务
Access Token
访问令牌用来访问受保护资源的凭据。它是授权服务器发给客户端的授权,是一串表示授予特定范围特定时间的访问凭据。
refresh Token
刷新令牌用来获取Access Token,是授权服务器发给客户端的通常将访问令牌和刷新令牌一并返回,当访问令牌失效或者过期时可以通过刷新令牌重新获取访问令牌。刷新令牌只能用于授权服务器,并从来不会发给资源所有者。
刷新的流程如图所示:
- (A) 客户端请求获取访问令牌,并向授权服务器提供授权许可
- (B) 授权服务器对客户端身份进行认证,并校验授权许可,如果校验通过,则发放访问令牌和刷新令牌
- (C) 客户端访问受保护的资源,并向资源服务器提供访问令牌
- (D) 资源服务器校验访问令牌,如果校验通过,则提供服务
- (E) 重复(C)和(D)直到访问令牌过期。如果客户端直到访问令牌已经过期,则跳至(G),否则不能继续访问受保护的资源
- (F) 自从访问令牌失效以后,资源服务器返回一个无效的令牌错误
- (G) 客户端请求获取一个新的访问令牌,并提供刷新令牌
- (H) 授权服务器对客户端进行身份认证并校验刷新令牌,如果校验通过,则发放新的访问令牌(并且,可选的发放新的刷新令牌)
OAuth定义了四种授权类型:
- authorization code 授权码
- implicit 隐式授权
- resource owner password credentials 资源拥有者密码凭证
- client credentials 客户端凭证
因为SPAPI的授权用到的是授权码类型故主要了解授权码类型。
授权码流程如图所示:
- (A) 客户端通过将资源所有者的用户代理指向授权端点来启动这个流程。客户端包含它的客户端标识符,请求范围,本地状态,和重定向URI,在访问被允许(或者拒绝)后授权服务器立即将用户代理返回给重定向URI。
- (B) 授权服务器验证资源所有者(通过用户代理),并确定资源所有者是否授予或拒绝客户端的访问请求。
- (C) 假设资源所有者授权访问,那么授权服务器用之前提供的重定向URI(在请求中或在客户端时提供的)将用户代理重定向回客户端。重定向URI包括授权码和前面客户端提供的任意本地状态。
- (D) 客户端用上一步接收到的授权码从授权服务器的令牌端点那里请求获取一个访问令牌。
- (E) 授权服务器对客户端进行认证,校验授权码,并确保这个重定向URI和第三步(C)中那个URI匹配。如果校验通过,则发放访问令牌,以及可选的刷新令牌。
4.1 OAuth2.0 授权码类型的授权流程
4.1.1. Authorization Request
客户端通过使用“application/x-www-form- urlencoding”格式向授权端点URI的查询组件添加以下参数来构造请求URI
- response_type:必须的。值必须是"code"。
- client_id:必须的。客户端标识符。
- redirect_uri:可选的。
- scope:可选的。请求访问的范围。
- state:推荐的。一个不透明的值用于维护请求和回调之间的状态。授权服务器在将用户代理重定向会客户端的时候会带上该参数。
例如:
GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
Host: server.example.com
4.1.2. Authorization Response
如果资源所有者授权访问请求,授权服务器发出授权代码并通过使用“application/x-www-form- urlencoding”格式向重定向URI的查询组件添加以下参数,将其给客户端。
- code:必须的。授权服务器生成的授权码。授权代码必须在发布后不久过期,以减少泄漏的风险。建议最大授权代码生命期为10分钟。客户端不得多次使用授权代码。如果授权代码不止一次使用,授权服务器必须拒绝请求,并在可能的情况下撤销先前基于该授权代码发布的所有令牌。授权代码是绑定到客户端标识符和重定向URI上的。
- state:如果之前客户端授权请求中带的有"state"参数,则响应的时候也会带上该参数。
例如:
HTTP/1.1 302 Found
Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA&state=xyz
4.1.3.1. Error Response
- error:取值如下error_description:可选的
- invalid_request
- unauthorized_client
- access_denied
- unsupported_response_type
- invalid_scope
- server_error
- temporarily_unavailable
- error_description
- error_uri:可选的
4.1.3. Access Token Request
客户端通过使用“application/ www-form-urlencoding”格式发送以下参数向令牌端点发出请求
- grant_type:必须的。值必须是"authorization_code"。
- code:必须的。值是从授权服务器那里接收的授权码。
- redirect_uri:如果在授权请求的时候包含"redirect_uri"参数,那么这里也需要包含"redirect_uri"参数。而且,这两处的"redirect_uri"必须完全相同。
- client_id:如果客户端不需要认证,那么必须带的该参数。
例如:
POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb
4.1.4. Access Token Response
例如:
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
"access_token":"2YotnFZFEjr1zCsicMWpAA",
"token_type":"example",
"expires_in":3600,
"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
"example_parameter":"example_value"
}
4.2与亚马逊网站授权流程对比
4.2.1卖家从你的网站启动授权
首先我用C#的GUID生成了一个state状态,之后将application_id 和 state 填入以下链接
其中 version=beta 表示应用程序为草稿状态。
4.2.2 卖家同意授权应用程序
会弹出授权页面,点击confirm即可授权成功
4.2.3 亚马逊向您发送授权信息
亚马逊从定向URI加载到浏览器中并返回以下参数
接下来验证state 是不是你之前传过去的state(也就是我之前用的GUID)我认为此处用于验证这个授权请求是不是我发的。
然后保存selling_partner_id 和 spapi_oauth_code 到数据库。mws_auth_token 是不会返回数据的
4.2.4 用 LWA 授权码交换 LWA 刷新令牌
调用授权服务器包含以下参数:
HttpRequest
POST /auth/o2/token HTTP/l.l
Host: api.amazon.com
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
grant_type=authorization_code&code=SplxlOexamplebYS6WxSbIA&client_id=foodev&client_secret=Y76SDl2F
返回参数如下所示:
HttpResponse
HTTP/l.l 200 OK
Content-Type: application/json;
charset UTF-8
Cache-Control: no-store
Pragma: no-cache
{
"access_token":"Atza|IQEBLjAsAexampleHpi0U-Dme37rR6CuUpSR",
"token_type":"bearer",
"expires_in":3600,
"refresh_token":"Atzr|IQEBLzAtAhexamplewVz2Nn6f2y-tpJX2DeX"
}
将刷新令牌保存到数据库。这样我们就可以用这个刷新令牌去请求授权服务器无限获取访问令牌了。
5. URI和URL
URI包括URL和URN两个类别,URL是URI的子集,所以URL一定是URI,而URI不一定是URL
URI = Universal Resource Identifier 统一资源标志符,用来标识抽象或物理资源的一个紧凑字符串。
URL = Universal Resource Locator 统一资源定位符,一种定位资源的主要访问机制的字符串,一个标准的URL必须包括:protocol、host、port、path、parameter、anchor。
URN = Universal Resource Name 统一资源名称,通过特定命名空间中的唯一名称或ID来标识资源。