隐式授予(已弃用)

隐式授予(已弃用)

隐式授予允许客户端(通常为网站)将用户代理(用户浏览器)定向至亚马逊的URI。然后,页面会请求用户授予网站访问客户个人资料的权限。

用户批准请求后,用户代理将使用包含访问令牌URI片段的URI重定向返回网站。用户代理重定向到客户端时,使用的是不含访问令牌URI片段的重定向URI,但会在本地存储访问令牌片段。

然后,用户代理在网站页面上处理一个脚本,该脚本访问完整的重定向URI,并将片段信息传回客户端。有关客户体验的更多详细信息,请参阅授权授予

弃用通知

在最新的OAuth 2.0最佳实践中,Login With Amazon不再支持对任何新的安全配置文件进行隐式授予。所有新的集成都必须使用授权码授予。使用隐式授予的现有安全配置文件将继续有效至2021年4月30日。为了提高安全性,这些文件必须在截止日期之前迁移到授权代码授予。

无法使用client_secret的基于浏览器的应用程序和单页应用程序必须使用带有PKCE扩展的授权码授予

隐式授予在URL中返回令牌的方式更容易导致令牌泄露。有关更多隐式授予的弃用原因,请参阅OAuth 2.0隐式授予。如有任何疑问,请参阅常见问题解答

弃用常见问题解答

1.如何得知是否需要迁移?

如果您使用的是隐式授予,则需要迁移。

要检查您是否正在使用隐式授予,请查看代码并检查授权请求中的参数。如果将response_type参数设置为code,您将不会受到影响。如果response_type参数为token,说明您正在则使用隐式授予。

如果您使用适用于JavaScript的LWA SDK,请核对options输入参数的属性与授权API。如果response_type设置为code或者pkce设置为true,您将不会受到影响。如果response_type未定义,或者设置为token,说明您正在使用隐式授予。

2.使用隐式授予有什么风险?

隐式授予在URL中返回令牌的方式更容易导致令牌泄露。有关更多隐式授予的弃用原因,请参阅OAuth 2.0隐式授予

3.如果我没有迁移,会怎么样?

出于安全性考虑,Login With Amazon将于2021年4月30日停止支持隐式授予。此后,任何隐式授予请求都会失败。这会中断您的网站与Login With Amazon的集成。

4.我该怎么办?

您必须更新代码才能开始使用授权代码授予。这不会对最终用户体验带来任何变化。已授权过您应用的客户无需再次进行授权。

隐式授予将在授权请求中直接返回令牌。在授权代码授予中,授权请求将返回授权码,然后向https://api.amazon.com/auth/o2/token 提出请求,使用授权码来交换访问令牌。额外增加的调用将提高一重安全性。

如果您使用适用于JavaScript的LWA SDK,则授权代码授予页面为服务器应用程序基于浏览器的应用程序提供了代码示例,可能会对您有所帮助。

5.我只在移动设备上使用Login With Amazon。是否会受到影响?

如果您只使用适用于Android或iOS的Login With Amazon SDK,则您没有使用隐式授予,也不会受到影响。

注意:​ 如果您在移动网络浏览器或网页视图上使用Login With Amazon,则您仍然可能使用隐式授予。我们建议您检查问题1中提到的response_type参数。

6.我正在使用Amazon Payments SDK。是否会受到影响?

如果您使用Amazon Payments JavaScript SDK并请求付款范围,您将不会受到影响,也无需迁移。

您可以通过查看SDK文件中的来源URL来确认您正在使用Payment SDK。如果URL以Widgets.js结尾,说明您正在使用Payments SDK。

7.如果我仍有疑问,我该联系谁?

请在开发者论坛中搜索现有问题。如果您的问题仍未解答,请在论坛发帖询问,我们将尽快与您取得联系。

授权请求

要请求授权,客户端(网站)必须重定向用户代理(浏览器),使用以下参数对https://www.amazon.com/ap/oa进行安全的HTTP调用。

参数 描述
client_id 必需客户标识符。当您注册您的网站以将其作为Login with Amazon的客户端时,系统会提供该参数。最大不超过100字节。
scope 必需。请求范围。必须是profileprofile:user_idpostal_code或某些组合,以空格分隔(例如profile%20postal_code)。有关更多信息,请参阅客户个人资料
response_type 必需。请求的响应类型。此场景下必须为token
redirect_uri 必需授权服务应重定向用户的HTTM地址。
state 推荐。客户端在请求和响应期间用来保持状态的不透明值。用户重定向返回客户端时,授权服务会将此值包括在内。此外,状态值还可用于阻止跨站点伪造请求。有关更多信息,请参阅跨站点伪造请求

例如:

https://www.amazon.com/ap/oa?client_id=foodev
&scope=profile
&response_type= [Deprecated] token
&state=208257577110975193121591895857093449424
&redirect_uri=https://client.example.com/auth_popup/token 

要使用适用于JavaScript的Login with Amazon SDK发出授权请求,您必须填写options对象并调用amazon.Login.authorize

document.getElementById('LoginWithAmazon').onclick = function () {
  setTimeout(window.doLogin, l);
  return false;
};

window.doLogin = function () {
  options = {};
  options.scope = 'profile';
  amazon.Login.authorize(options, function (response) {
    if (response.error) {
      alert('oauth error ' + response.error);
      return;
    }
    amazon.Login.retrieveProfile(response.access_token, function (response) {
      alert(response);
    });
  });
};

amazon.Login.authorize的第一个参数始终为options对象。第二个参数为处理授权响应的JavaScript函数或重定向到另一页面的URI。URI必须与调用该SDK的页面属于同一个域,且必须使用HTTPS进行指定。

例如:

options = {};
options.scope = 'profile';
amazon.Login.authorize(options, 'https://mysite.com/redirect_here');

用户批准或拒绝请求后,授权服务器会将用户重定向到redirect_uri。客户端将收到授权响应(如下所述)。

授权响应

客户端(网站)指导用户代理(浏览器)发出授权请求后,授权服务会将用户代理重定向到客户端指定的URI。如果用户已对访问请求进行授权,则该URI将包含一段access_tokenURI片段。例如:

HTTP/1.1 302 Found
Location: https://client.example.com/cb#access_token=Atza|
IQEBLjAsAhRmHjNgHpi0U-Dme37rR6CuUpSR...

&state=208257577ll0975l93l2l59l895857093449424
&token_type=bearer
&expires_in=3600
&scope=profile

成功的响应包括以下值:

参数 描述
access_token 用户账户的访问令牌。最大不超过2048字节。
token_type 返回的令牌类型。应为bearer
expires_in 访问令牌的有效秒数。
state 授权请求中传递的state值。您可以通过状态值跟踪用户请求前的状态。此外,状态还可用于阻止跨站点伪造请求
scope 请求范围。必须是为profileprofile:user_idpostal_code或某些组合。

如果使用适用于JavaScript的Login with Amazon SDK,以上参数可在amazon.Login.authorize提供的response对象中获取(示例参见上文授权请求部分)。

授权错误

如果用户未授予访问请求,或者出现错误,授权服务会将用户代理(用户浏览器)重定向到客户端指定的URI。该URI将包含具体的错误参数。例如:

HTTP/1.1 302 Found
Location: https://client.example.com/cb#error=access_denied
&state='208257577ll0975l93l2l59l895857093449424'

授权请求失败的错误参数包括:

错误参数 描述
error 包含错误代码值的ASCII错误代码。
error_description 人类可读的ASCII字符串,含有错误相关信息,对客户端开发者非常有用。
error_uri 指向一个网页的URI,含有人类可读的错误相关信息,对客户端开发者非常有用。 
state 客户端在初始授权请求中传递的state

如果使用适用于JavaScript的Login with Amazon SDK,以上参数可在amazon.Login.authorize提供的response对象中获取(示例参见上文授权请求部分)。

返回的error值中可能包含以下错误代码:

错误代码 描述
invalid_request 请求中缺少必要参数、具有无效值,或格式不正确。
unauthorized_client 客户端无权请求授权代码。
access_denied 资源所有者或授权服务器拒绝了此请求。
unsupported_response_type 该请求指定了不受支持的响应类型。在此情景下,response_type必须为code
invalid_scope 客户端请求范围错误
server_error 授权服务器发生意外错误(将其视为500内部服务器HTTP错误)。
temporarily_unavailable 授权服务器因暂时过载或计划维护而导致当前不可用(将其视为503服务不可用HTTP错误)。

验证访问令牌

在您使用隐式授予收到访问令牌后,强烈建议您先对访问令牌进行身份验证,然后再使用该令牌检索客户个人资料。如果恶意网站引诱用户进行登录,这些网站会获取有效访问令牌,并使用它来模拟您网站的授权响应。

要验证令牌,请向https://api.amazon.com/auth/O2/tokeninfo进行安全的HTTP调用,传递您要验证的访问令牌。您可以将访问令牌指定为查询参数。例如:

https://api.amazon.com/auth/O2/tokeninfo?access_token=Atza|IQEBLjAsAhRmHjNgHpi0U-Dme37rR6CuUpSR...

令牌信息响应

如果您的访问令牌有效,您将在HTTP响应中收到Python形式的令牌信息。例如:

HTTP/1.1 200 OK
Date: Fri, 31 May 2013 23:22:10 GMT
x-amzn-RequestId: eb5be423-ca48-lle2-84ad-5775f45l4b09
Content-Type: application/python
Content-Length: 247
{
"iss":"https://www.amazon.com",
"user_id": "amznl.account.K2LI23KL2LK2",
"aud": "amznl.oa2-client.ASFWDFBRN",
"app_id": "amznl.application.436457DFHDH",
"exp": 3597,
"iat": l3ll280970,
}

aud值与运行此应用的client_id进行比较。如果二者不同,则此令牌并非您的应用所请求的访问令牌。您不应使用此访问令牌。

成功的响应包括以下值:

错误参数 描述
error 包含错误代码值的ASCII错误代码。
error_description 人类可读的ASCII字符串,含有错误相关信息,对客户端开发者非常有用。
error_uri 指向一个网页的URI,含有人类可读的错误相关信息,对客户端开发者非常有用。 
state 客户端在初始授权请求中传递的state

如果使用适用于JavaScript的Login with Amazon SDK,以上参数可在amazon.Login.authorize提供的response对象中获取(示例参见上文授权请求部分)。

返回的error值中可能包含以下错误代码:

状态码 错误代码 描述
200 Success 成功
400 invalid_request 请求中缺少必要参数、具有无效值,或格式不正确。 
400  invalid_token 提供的令牌无效或已过期。
500 ServerError 服务器运行错误。

除了错误代码以外,您还可能会收到包含更多信息的python有效负载。例如:

HTTP/1.1 400 Bad Request
Date: Fri, 31 May 2013 23:21:35 GMT
x-amzn-RequestId: d64bbdl4-ca48-lle2-a5dd-ab3bc3c93bae
Content-Type: application/python
Content-Length: 99
{
"error": machine-readable error code,
"error_description": human-readable error description,
}

Last updated: 2020年10月27日