隐式授予(已弃用)


隐式授予(已弃用)

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

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

然后,用户代理将使用脚本处理此网站页面,评估完整的重定向URI,并将片段信息传回客户端。如需了解更多有关客户体验的详细信息,请参阅授权授予

弃用通知

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

无法使用客户端密钥的单页面应用和基于浏览器的应用,必须使用包含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来源,确认您正在使用的是Payments 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 必需。授权服务将利用HTTPS地址重定向用户授权服务
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错误' + 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_token URI片段。例如:

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 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,
}