验证与授权

OAuth 和 Digi-Key API 概述

当客户端应用程序将浏览器重定向到 Digi-Key URL 时,授权序列开始。

该 URL 包含指明所请求访问类型的查询参数。

Digi-Key 的授权服务器负责处理用户验证和用户准许。 在验证过程中,使用的是最终用户的“我的 Digi-Key”用户名和密码(而不是开发者的用户名和密码)。

结果返回一个授权码,是由 Digi-Key 的授权服务器以查询字符串的形式返回到您的应用程序的。
客户端应用程序在收到授权码后,可以将该代码(用应用程序的客户端 ID 和客户端密钥进行请求)交换成访问令牌和刷新令牌。

然后,客户端应用程序可以使用访问令牌访问它已订阅的 Digi-Key API。
刷新令牌可用于随时获取新的访问令牌。 这就是所谓的离线访问,因为当应用程序获取新的访问令牌时,用户不必在场。

 

基本步骤

所有客户端应用程序,同时包括沙盒生产环境,在使用 OAuth 2.0 框架向 Digi-Key API 发出请求时,都会遵循一基本模式。
总体来说,有四步:

创建应用程序

当您创建应用程序时,将被提供一个 OAuth2 客户端 ID 和客户端密钥。 复制该信息并确保其安全,以备您的客户端应用程序将来使用。

获取授权码并授予应用程序访问权

通过让用户登录自己的 Digi-Key 账户自行进行身份验证,从而获得授权码。 登录后,系统会要求用户对请求的应用程序进行授权。 授权会给应用程序授予对 Digi-Key 账户的访问权。 如果用户授予权限,Digi-Key 的授权服务器就会向应用程序发送一个授权码。 如果用户没有授予权限,授权服务器就会返回一个错误。

获取访问令牌

通过向授权服务器的令牌端点发送授权码、客户端 ID、客户端密钥和授予类型来获取访问令牌。 您将收到一个访问令牌和一个刷新令牌。

将访问令牌发送至 API

通过传递带有请求报头的访问令牌,客户端应用程序现在可以向其订阅的 DK API 发出请求。当访问令牌过期时,客户端应用程序可以提交存储的刷新令牌来接收新一组凭证。

 

OAuth 序列

 

 

沙盒应用程序

以下是完成用于沙盒应用程序的 OAuth 进程的必要信息。 在继续前,请确认客户端应用程序已经注册,其客户端 ID 和客户端密钥已被存储和保护,并且订阅了沙盒 API 产品。

 

获取授权码

用于用户验证的端点,这在浏览器中完成

沙盒授权端点描述
https://sandbox-api.digikey.com/v1/oauth2/authorize这个端点是初始请求的目标。 它处理用户验证和用户准许。 结果包括授权码。

 

在浏览器中发送 url 编码所需的一组查询参数。

参数描述
response_type编码告诉授权服务器返回一个授权码。
client_id分配给注册应用程序的客户 ID。识别发出请求的客户端应用程序。 此参数中传递的值必须与分配给它的值完全匹配。
redirect_uri开发者定义了重定向 URI确定响应的发送地点。 这个参数的值必须与您在注册应用程序时提供的 URI 完全匹配(包括后面的 '/')。

 

url 编码的代码请求和所需的查询参数实例:

https://sandbox-api.digikey.com/v1/oauth2/authorize?response_type=code&client_id=123456789abcdefg&redirect_uri=https%3A%2F%2Fclient-app-redirect-uri%2F

在上面的例子中,粗体突出显示了字符的 url 编码。字符 ":" 的 url 编码为 "%3A"。 字符 "/" 的 url 编码为 "%2F"

如浏览器中所见:

在浏览器中进行的授权

 

处理响应

响应将按照请求 URL 中的指定,发送到重定向 URI。 如果用户批准访问请求,那么响应就会包含一个授权码。 如果用户不批准该请求,则响应会包含一个错误信息。 所有响应都会通过查询字符串返回浏览器,如下所示:

一个错误响应:

https://client-app-redirect-uri/code?error=access_denied

 

一个授权码响应:

https://client-app-redirect-uri/?code=lboI52TG&scope=&state=null

注意:代码(例如:lboI52TG)在创建后将在一分钟内失效。

 

获取访问令牌

浏览器收到授权码后,您的应用程序可能会用授权码交换一个访问令牌和一个刷新令牌。 用于获取令牌的 URL 是:

沙盒访问令牌端点描述
https://sandbox-api.digikey.com/v1/oauth2/token这个端点是第二个请求的目标。 对该端点的请求结果包括访问令牌和刷新令牌

 

访问令牌的请求是一个 HTTPS POST 请求,必须包含以下 x-www-form-urlencoded 数据:

参数描述
编码初始请求返回的授权码。该代码在创建一分钟后失效。
client_id这是您在 API 入口中生成的分配给应用程序的客户端 ID。
client_secret这是您在 API 入口中生成的分配给应用程序的客户端密钥。
redirect_uri确定响应的发送地点。 这个参数的值必须与您在注册应用程序时定义的 URI 完全匹配(包括后面的 '/')。
grant_type按照 OAuth 2.0 规范的定义,这个字段必须包含值 authorization_code

 

实际请求可能像下面这样:

POST /v1/oauth2/token HTTP/1.1 Host: sandbox-api.digikey.com Content-Type: application/x-www-form-urlencoded code=lboI52TG& client_id=application_client_id& client_secret=application_client_secret& redirect_uri=https://client-app-redirect-uri& grant_type=authorization_code

 

对该请求的成功响应包含以下字段:

字段描述
access_token为访问 Digi-Key API 而发送的令牌。
refresh_token可以为获得新的访问令牌而提交的令牌。
expires_in访问令牌的剩余寿命,以秒为单位。
refresh_token_expires_in刷新令牌的剩余寿命,以秒为单位。
token_type返回的令牌类型。

 

成功响应作为 JSON 对象返回。

成功访问令牌请求的示例响应:

{ "access_token": "SLKDosk89/DOSID-frt3234SLsofds", "refresh_token": "oPu5qu7wPhuVBcTZqmx4NFfhlnSB6hVUJ5uSIhS0CM", "expires_in": 1799, "refresh_token_expires_in": 7775999, "token_type": "BearerToken", }

注意:响应中可能包含其他字段,您的应用程序不应将其视为错误。 上面显示的集合是最小的集合。

 

使用刷新令牌

如上节所述,当您获得初始访问令牌时,会获得一个刷新令牌。 在这些情况下,您的应用程序可以通过向 Digi-Key 的授权服务器发送刷新令牌来获得新的访问令牌。

为了以这种方式获得新的访问令牌,您的应用程序需要向令牌端点发送一个 HTTPS POST 请求。

https://sandbox-api.digikey.com/v1/oauth2/token

 

该请求必须包括这组必须的参数:

参数描述
client_id分配给注册应用程序的客户 ID。
client_secret分配给注册应用程序的客户密钥。
refresh_token保存下来以备提交的刷新令牌。
grant_type按照 OAuth 2.0 规范的定义,这个字段必须包含一个 refresh_token 值。

 

这样的请求看起来会类似下面这个样子:

POST /v1/oauth2/token HTTP/1.1 Host: sandbox-api.digikey.com Content-Type: application/x-www-form-urlencoded client_id=application_client_id& client_secret=application_client_secret& refresh_token=123Asfeksodk/jkdsoieDSioIOS-483LidkOOl& grant_type=refresh_token

只要用户没有撤销授予您应用程序的访问权,响应就会提供一组新的令牌。

 

成功刷新令牌请求的示例响应:

{ "access_token": "SLKDosk89/DOSID-frt3234SLsofds", "refresh_token": "oPu5qu7wPhuVBcTZqmx4NFfhlnSB6hVUJ5uSIhS0CM", "expires_in": 1799, "refresh_token_expires_in": 7775999, "token_type": "BearerToken", }

注意:每次获得新的访问令牌时,刷新令牌都会重新生成。 请务必保存最新的刷新令牌,因为旧的令牌将不再有效。

 

 

生产应用程序

以下是完成针对生产应用程序的 OAuth 进程必需的信息。 在继续前,请确认客户端应用程序已经注册,其客户端 ID 和客户端密钥已被存储和保护,并且订阅了生产 API 产品

 

获取授权码

用于用户验证的端点,这在浏览器中完成

生产授权端点描述
https://api.digikey.com/v1/oauth2/authorize这个端点是初始请求的目标。 它处理用户验证和用户准许。 结果包括授权码。

 

在浏览器中发送 url 编码所需的一组查询参数。

参数描述
response_type编码告诉授权服务器返回一个授权码。
client_id分配给注册应用程序的客户 ID。识别发出请求的客户端。 此参数中传递的值必须与 API 入口分配的值完全匹配。
redirect_uri开发者定义了重定向 URI确定响应的发送地点。 这个参数的值必须与您在注册应用程序时定义的 URI 完全匹配(包括后面的 '/')。

 

url 编码的代码请求和所需的查询参数实例:

https://api.digikey.com/v1/oauth2/authorize?response_type=code&client_id=123456789abcdefg&redirect_uri=https%3A%2F%2Fclient-app-redirect-uri%2

在上面的例子中,粗体突出显示了字符的 url 编码。字符 ":" 的 url 编码为 "%3A"。 字符 "/" 的 url 编码为 "%2F"

如浏览器中所见:

在浏览器中完成

 

处理响应

响应将按照请求 URL 中的指定,发送到重定向 URI。 如果用户批准访问请求,那么响应就会包含一个授权码。 如果用户不批准该请求,则响应会包含一个错误信息。 所有响应都会通过查询字符串返回浏览器,如下所示:

一个错误响应:

https://client-app-redirect-uri/code?error=access_denied

 

一个授权码响应:

https://client-app-redirect-uri/code?code=lboI52TG&scope=&state=null

注意:代码(例如:lboI52TG)在创建后将在一分钟内失效。

 

获取访问令牌

浏览器收到授权码后,您的应用程序可能会用授权码交换一个访问令牌和一个刷新令牌。 用于获取令牌的 URL 是:

生产访问令牌端点描述
https://api.digikey.com/v1/oauth2/token这个端点是第二个请求的目标。 对该端点的请求结果包括访问令牌和刷新令牌

 

访问令牌的请求是一个 HTTPS POST 请求,必须包含以下 x-www-form-urlencoded 数据:

字段描述
编码初始请求返回的授权码。 该代码在创建一分钟后失效
client_id分配给注册应用程序的客户 ID。
client_secret分配给注册应用程序的客户密钥。
redirect_uri确定响应的发送地点。 这个参数的值必须与您在注册应用程序时定义的 URI 完全匹配(包括后面的 '/')。
grant_type按照 OAuth 2.0 规范的定义,这个字段必须包含值 authorization_code

 

一个授权码 POST 请求实例:

POST /v1/oauth2/token HTTP/1.1 Host: api.digikey.com Content-Type: application/x-www-form-urlencoded code=lboI52TG& client_id={application_client_id}& client_secret={application_client_secret}& redirect_uri=https://client-app-redirect-uri& grant_type=authorization_code

 

对该请求的成功响应包含这些字段:

字段描述
access_token为访问 Digi-Key API 而发送的令牌。
refresh_token可以为获得新的访问令牌而提交的令牌。
expires_in访问令牌的剩余寿命,以秒为单位。
refresh_token_expires_in刷新令牌的剩余寿命,以秒为单位。
token_type返回的令牌类型。

 

成功响应作为 JSON 对象返回。

成功访问令牌请求的示例响应:

{ "access_token": "SLKDosk89/DOSID-frt3234SLsofds", "refresh_token": "oPu5qu7wPhuVBcTZqmx4NFfhlnSB6hVUJ5uSIhS0CM", "expires_in": 1799, "refresh_token_expires_in": 7775999, "token_type": "BearerToken", }

注意:响应中可能包含其他字段,您的应用程序不应将其视为错误。 上面显示的集合是最小的集合。

 

 

使用刷新令牌

如上节所述,当您获得初始访问令牌时,会获得一个刷新令牌。 在这些情况下,您的应用程序可以通过向 Digi-Key 的授权服务器发送刷新令牌来获得新的访问令牌。

为了以这种方式获得新的访问令牌,您的应用程序需要向令牌端点发送一个 HTTPS POST 请求。

https://api.digikey.com/v1/oauth2/token

 

该请求必须包括这组必须的参数:

字段描述
client_id分配给注册应用程序的客户 ID。
client_secret分配给注册应用程序的客户密钥。
refresh_token保存下来以备提交的刷新令牌。
grant_type按照 OAuth 2.0 规范的定义,这个字段必须包含一个 refresh_token 值。

 

一个刷新令牌 POST 请求实例:

POST /v1/oauth2/token HTTP/1.1 Host: api.digikey.com Content-Type: application/x-www-form-urlencoded client_id={application_client_id}& client_secret={application_client_secret}& refresh_token=123Asfeksodk/jkdsoieDSioIOS-483LidkOOl& grant_type=refresh_token

只要用户没有撤销授予您应用程序的访问权,响应就会提供一组新的令牌。

成功刷新令牌请求的示例响应:

{ "access_token": "SLKDosk89/DOSID-frt3234SLsofds", "refresh_token": "oPu5qu7wPhuVBcTZqmx4NFfhlnSB6hVUJ5uSIhS0CM", "expires_in": 1799, "refresh_token_expires_in": 7775999, "token_type": "BearerToken", }

注意:每次获得新的访问令牌时,刷新令牌都会重新生成。 请务必保存最新的刷新令牌,因为旧的令牌将不再有效。

 

 

代码和令牌有效期

所有代码和令牌都有有效期。

类型有效期
授权码1 分钟
访问令牌30 分钟
刷新令牌90 天

 

 

进行 API 调用

OAuth 完成后,应用程序即可发送请求。

开发者应用程序示例请求(沙盒)

使用开发者凭证和端点 (sandbox-api.digikey.com) 向 PartSearch 发出的示例请求:

GET /Search/v3/Products/p5555-nd HTTP/1.1 Host: sandbox-api.digikey.com X-DIGIKEY-Client-Id: WugAd2A6Lxy3Eu3Mgvov45KUNoguMoUl Authorization: Bearer StgGLw9b3hkwqlWAGBmdYoBNEokm X-DIGIKEY-Locale-Site: US X-DIGIKEY-Locale-Language: en X-DIGIKEY-Locale-Currency: USD X-DIGIKEY-Locale-ShipToCountry: us X-DIGIKEY-Customer-Id: 0

 

组织应用程序示例请求(生产)

使用组织凭证和端点 (api.digikey.com) 向 PartSearch 发出的示例请求:

GET /Search/v3/Products/p5555-nd HTTP/1.1 Host: api.digikey.com X-DIGIKEY-Client-Id: heWGx9w6DK8kZf3jRv5E9jUAhXrGBU67 Authorization: Bearer s4T5DbmFZadjNRAEbUnN9zkU3DBj X-DIGIKEY-Locale-Site: US X-DIGIKEY-Locale-Language: en X-DIGIKEY-Locale-Currency: USD X-DIGIKEY-Locale-ShipToCountry: us X-DIGIKEY-Customer-Id: 0

 

 

授权报头的值带有 "Bearer" 前缀

例如:"Authorization": "Bearer xGr69sdAjLmnAHwGF4R1HedfDHl3j"

 

值 "Bearer" 必须和 BearerToken 一起发送,否则会收到一个Bearer 令牌错误。

"Authorization":"Bearer <BearerToken>"