所有 REST 请求都必须先获得 REST API 的访问授权。当在小组件中使用 Javascript 通过 $.limyee 的 REST 方法访问 REST API 时,无须添加其他头数据。对于所有其他方案,必须为要处理的请求指定 REST 头。为了防止令牌和ID被拦截,建议始终使用 HTTPS 向您的 Limyee 电商平台进行身份验证。
使用内置的 OAuth 服务
Limyee 电商平台带有内置的 OAuth 服务,可以处理从您的应用程序登录到 Limyee 电商平台。内置的 OAuth 服务是基于 OAuth 2.0 规范。它允许您的用户在不放弃密码的情况下访问他们的平台内容。使用 OAuth 进行身份验证是在将 Limyee 电商平台集成到您的应用程序时,针对 Limyee 电商平台进行身份验证的推荐方法。
Limyee 电商平台 OAuth 服务提供商使用四种授权类型,如果客户端类型配置为机密,则可以同时使用所有这些类型。
添加新客户端
可以存在多个客户端,并同时用于一个或多个外部应用程序。要添加新客户端或管理现有客户端,请转到 Limyee 电商平台中的管理>集成> OAuth 客户端。为客户端应用程序选择了适当的值(如下所述)后,单击"保存"按钮。
名字
名称字段是必需的,用于标识 OAuth 客户端。
描述
描述字段是可选的,用于描述 OAuth 客户端。
主网址
"主 URL"字段是必需的,是客户端应用程序的 URL。
回调网址
回调 URL 字段是可选的,它是在授权客户端后要重定向到的 URL。应将其设置为处理 OAuth 响应的外部应用程序中的 HTTP 终结点。
客户端类型
"客户端类型"字段是必需的,默认值为"机密"。仅当客户端无法维护其凭据的机密性(例如,在资源所有者使用的设备上执行的客户端,如:安装在本地的应用程序或基于浏览器的应用程序)并且无法通过任何其他方式维护客户端身份验证安全时,才应选择"公开"。
客户端类型 |
描述 |
公开 |
当客户端无法维护其凭据的机密性时(例如,在资源所有者使用的设备上执行的客户端,如:安装在本地的应用程序或基于浏览器的应用程序),并且无法通过任何其他方式客户端身份验证安全。 |
机密 |
当客户端能够维护其凭据的机密性时(例如,客户端在具有对客户端凭据的有限访问的安全服务器上实现),或者能够使用其他方式维护客户端身份验证安全。 |
资助类型
有四种授权类型,用于定义客户端应用程序获取访问令牌的方式。访问令牌是 Limyee 电商平台在授予客户端应用程序访问权限时提供的随机字符串。客户端应用程序在向 Limyee 电商平台发出的每个请求上使用访问令牌。访问令牌是特定于用户的,用于标识用户,以便将适当的安全上下文应用于请求。
授权类型 |
描述 |
含蓄 |
可与"机密"或"公共"客户端类型一起使用。为了实现隐式授权类型,客户端应用程序对用户进行身份验证,并将用户发送到 Limyee 电商平台 站点。 然后,用户确认他们希望允许客户端应用程序代表他们执行操作。然后,用户被重定向到客户端定义的重定向 URL,并带有access_token,并将expires_in追加到查询字符串。 此授权类型最适合已经利用与 Limyee 电商平台的单点登录集成的外部应用程序 . |
授权码 |
只能与"机密"客户端类型一起使用。为了实现授权代码授予类型,用户使用客户端应用程序进行身份验证,然后将用户发送到 Limyee 电商平台站点,以便用户可以确认他们希望允许客户端应用程序代表他们执行操作。 确认后,用户将被重定向到定义的重定向 URL,并将代码值追加到查询字符串。提供的代码称为授权代码。授权代码是客户端应用程序用于回发到 Limyee 电商平台站点的随机字符串。响应将包含access_token、expires_in和refresh_token或错误。 可以使用授权代码授权类型的 OAuth 客户端配置为受信任。当客户端受信任时,在请求授权代码时,用户将不会显示授权表单。只有由平台所有者管理的外部应用程序才应完全受信任,例如,扩展平台的内容管理系统和平台移动版本。 此授权类型适用于利用 Limyee 电商平台进行身份验证的应用程序,或者外部应用程序管理一组单独的身份验证详细信息的应用程序,或者适用于最终用户也经常访问 Limyee 电商平台 UI 的长期选择加入集成。 |
用户凭据 |
可与"机密"或"公共"客户端类型一起使用。客户端应用程序将用户凭据传递到 Limyee 电商平台站点。响应包含access_token、expires_in和refresh_token或错误的值。 此授予类型适用于利用 Limyee 电商平台进行身份验证的应用程序,以及必须防止暴露于 Limyee 电商平台站点的应用程序。 |
客户端凭据 |
只能与"机密"客户端类型一起使用。用户向客户端应用程序提供其 Limyee 电商平台用户名。然后,客户端应用程序发布到 Limyee 电商平台站点。然后,响应将包含access_token、expires_in和refresh_token或错误。 此授权类型最适合受信任的实用程序。 |
使用隐式授权类型
使用隐式授权类型时,客户端应用程序需要使用以下参数向您的 Limyee 电商平台站点发出请求:api/v1/oauth/authorize:
参数 |
描述 |
response_type |
制作值标记。 |
client_id |
您的客户端 ID。您可以通过转到 Limyee 电商平台站点>管理>集成> OAuth 客户端,然后单击您添加的客户端旁边的"客户端凭据"按钮来获取此信息。 |
redirect_uri |
用户在授权(或选择不授权)应用程序后应重定向到的 URI。这应该与在 Limyee 电商平台中设置 OAuth 客户端时使用的URI相匹配。 |
隐式授权请求的工作流是:
下面是使用隐式授权类型获取访问令牌的请求的示例实现:
string clientId = "1E38F9AE-7FBB-42CC-A9CD-3805D4F6AD46"; string redirectUri = "http://mysite.com/HandleImplicit.ashx"; Response.Redirect(string.Format("https://mylimyeesite.com/api/v1/oauth/authorize?response_type=token&client_id={0}&redirect_uri={1}", clientId, redirectUri));
使用授权代码授予类型
使用授权代码授予类型时,客户端应用程序首先通过向 Limyee 电商平台站点发出请求来请求授权代码:api/v1/oauth/token,其中包含以下参数:
参数 |
描述 |
response_type |
使用值:code。 |
client_id |
您的客户端 ID。您可以通过转到 Limyee 电商平台站点>管理>集成> OAuth 客户端,然后单击您添加的客户端旁边的"客户端凭据"按钮来获取此信息。 |
redirect_uri |
用户在授权(或选择不授权)应用程序后应重定向到的 URI。这应该与在Limyee电商平台中设置OAuth客户端时使用的URI相匹配 . |
收到授权代码后,客户端应用程序将需要向您的Limyee电商平台站点发出另一个请求:api/v1/oauth/token,其中包含以下参数:
参数 |
描述 |
grant_type |
使用值:authorization_code。 |
client_id |
您的客户端 ID。您可以通过转到 Limyee 电商平台站点>管理>集成> OAuth 客户端,然后单击您添加的客户端旁边的"客户端凭据"按钮来获取此信息。 |
client_secret |
您的秘密。您可以通过转到 Limyee 电商平台站点>管理>集成> OAuth 客户端,然后单击您添加的客户端旁边的"客户端凭据"按钮来获取此信息。 |
code |
从重定向 URI 收到的访问代码。 |
来自受信任客户端的授权代码请求的工作流程是:
如果客户端不受信任,则用户必须授权身份验证请求,如以下修改后的工作流程所示:
下面是授权代码请求的示例实现:
var clientId = "1E38F9AE-7FBB-42CC-A9CD-3805D4F6AD46"; var redirectUri = "http://mysite.com/HandleAuthCode.ashx"; Response.Redirect(string.Format("https://mylimyeesite.com/api/v1/oauth/authorize?response_type=code&client_id={0}&redirect_uri={1}", clientId, redirectUri));
Limyee 电商平台将用户定向到外部应用程序的重定向 URL。下面是此请求的示例处理程序,其中包括使用收到的授权代码获取访问令牌:
var clientId = "1E38F9AE-7FBB-42CC-A9CD-3805D4F6AD46"; var clientSecret = "0123e6d304c4410d9dea8a32e8a1b85841b9099da9ba47aab1c174f5d5fb46e1"; var redirectUri = "http://mysite.com/HandleAuthCode.ashx"; var authCode = context.Request.QueryString["code"]; var authCodeExpiresUtc = context.Request.QueryString["expires_in"]; var tokenRequest = WebRequest.Create("https://mylimyeesite.com/api/v1/oauth/token") as HttpWebRequest; var data = string.Format("client_id={0}&client_secret={1}&grant_type=authorization_code&code={2}&redirect_uri={3}", clientId, clientSecret, authCode, redirectUri); byte[] bytes = Encoding.UTF8.GetBytes(data); tokenRequest.ContentType = "application/x-www-form-urlencoded"; tokenRequest.ContentLength = bytes.Length; tokenRequest.Method = "Post"; var requestStream = tokenRequest.GetRequestStream(); requestStream.Write(bytes, 0, bytes.Length); requestStream.Close(); string tokenResponse = null; using (var webTokenResponse = tokenRequest.GetResponse() as HttpWebResponse) { using (var reader = new StreamReader(webTokenResponse.GetResponseStream())) { tokenResponse = reader.ReadToEnd(); } } var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); var response = serializer.Deserialize<OAuthResponse>(tokenResponse); var oauthToken = response.access_token; var refreshToken = response.refresh_token; var tokenExpiresUtc = DateTime.UtcNow.AddSeconds(response.expires_in);
使用用户凭据授予类型
使用"用户凭据"授予类型时,客户端应用程序需要使用以下参数向您的 Limyee 电商平台站点 api/v1/oauth/token 发出请求:
参数 |
描述 |
grant_type |
使用值:password。 |
client_id |
您的客户端 ID。您可以通过转到 Limyee 电商平台站点>管理>集成> OAuth 客户端,然后单击您添加的客户端旁边的"客户端凭据"按钮来获取此信息。 |
username |
请求访问权限的用户的用户名。 |
password |
请求访问的用户的密码。 |
用户凭据请求的工作流:
下面是使用用户凭据授予类型检索访问令牌的请求的示例实现:
var clientId = "1E38F9AE-7FBB-42CC-A9CD-3805D4F6AD46"; var username = "RandomUser"; var password = "password"; var tokenRequest = WebRequest.Create("https://mylimyeesite.com/api/v1/oauth/token") as HttpWebRequest; var data = string.Format("client_id={0}&grant_type=password&username={1}&password={2}", clientId, username, password); byte[] bytes = Encoding.UTF8.GetBytes(data); tokenRequest.ContentType = "application/x-www-form-urlencoded"; tokenRequest.ContentLength = bytes.Length; tokenRequest.Method = "Post"; var requestStream = tokenRequest.GetRequestStream(); requestStream.Write(bytes, 0, bytes.Length); requestStream.Close(); string tokenResponse = null; using (var webTokenResponse = tokenRequest.GetResponse() as HttpWebResponse) { using (var reader = new StreamReader(webTokenResponse.GetResponseStream())) { tokenResponse = reader.ReadToEnd(); } } var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); var response = serializer.Deserialize<OAuthResponse>(tokenResponse); var oauthToken = response.access_token; var refreshToken = response.refresh_token; var tokenExpiresUtc = DateTime.UtcNow.AddSeconds(response.expires_in);
使用客户端凭据授予类型
使用客户端凭据授予类型时,客户端应用程序需要使用以下参数向您的 Limyee 电商平台站点发出请求:api/v1/oauth/token:
参数 |
描述 |
grant_type |
使用值:client_credentials。 |
client_id |
您的客户端 ID。您可以通过转到 Limyee 电商平台站点>管理>集成> OAuth 客户端,然后单击您添加的客户端旁边的"客户端凭据"按钮来获取此信息。 |
client_secret |
您的秘密。您可以通过转到 Limyee 电商平台站点>管理>集成> OAuth 客户端,然后单击您添加的客户端旁边的"客户端凭据"按钮来获取此信息。 |
username |
请求访问权限的用户的用户名。 |
客户端凭据请求的工作流:
下面是使用客户端凭据授予类型获取访问令牌的请求的示例实现:
var clientId = "1E38F9AE-7FBB-42CC-A9CD-3805D4F6AD46"; var clientSecret = "0123e6d304c4410d9dea8a32e8a1b85841b9099da9ba47aab1c174f5d5fb46e1"; var tokenRequest = WebRequest.Create("https://mylimyeesite.com/api/v1/oauth/token") as HttpWebRequest; var data = string.Format("client_id={0}&client_secret={1}&grant_type=client_credentials&username={2}", clientId, clientSecret, Username.Text); byte[] bytes = Encoding.UTF8.GetBytes(data); tokenRequest.ContentType = "application/x-www-form-urlencoded"; tokenRequest.ContentLength = bytes.Length; tokenRequest.Method = "Post"; var requestStream = tokenRequest.GetRequestStream(); requestStream.Write(bytes, 0, bytes.Length); requestStream.Close(); string tokenResponse = null; using (var webTokenResponse = tokenRequest.GetResponse() as HttpWebResponse) { using (var reader = new StreamReader(webTokenResponse.GetResponseStream())) { tokenResponse = reader.ReadToEnd(); } } var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); var response = serializer.Deserialize<OAuthResponse>(tokenResponse); var oauthToken = response.access_token; var refreshToken = response.refresh_token; var tokenExpiresUtc = DateTime.UtcNow.AddSeconds(response.expires_in);
刷新令牌
刷新令牌可用于获取新的访问令牌。客户端应用程序需要向您的Limyee电商平台站点发出请求:api/v1/oauth/token,其中包含以下参数:
参数 |
描述 |
grant_type |
使用值:refresh_token。 |
client_id |
您的客户端 ID。您可以通过转到 Limyee 电商平台站点>管理>集成> OAuth 客户端,然后单击您添加的客户端旁边的"客户端凭据"按钮来获取此信息。 |
client_secret |
您的秘密。您可以通过转到 Limyee 电商平台站点>管理>集成> OAuth 客户端,然后单击您添加的客户端旁边的"客户端凭据"按钮来获取此信息。 |
refresh_token |
获取access_token时收到的刷新令牌。 |
下面是使用刷新令牌获取访问令牌的请求的示例实现:
var clientId = "1E38F9AE-7FBB-42CC-A9CD-3805D4F6AD46"; var clientSecret = "0123e6d304c4410d9dea8a32e8a1b85841b9099da9ba47aab1c174f5d5fb46e1"; var refreshToken = "d0eacb4c6c724db7867f6d7a9d50d2d61e3efa0cc4c04a0ca4dc144ca6d09e02"; var tokenRequest = WebRequest.Create("https://mylimyeesite.com/api/v1/oauth/token") as HttpWebRequest; var data = string.Format("client_id={0}&client_secret={1}&grant_type=refresh_token&refresh_token={2}", clientId, clientSecret, refreshToken); byte[] bytes = Encoding.UTF8.GetBytes(data); tokenRequest.ContentType = "application/x-www-form-urlencoded"; tokenRequest.ContentLength = bytes.Length; tokenRequest.Method = "Post"; var requestStream = tokenRequest.GetRequestStream(); requestStream.Write(bytes, 0, bytes.Length); requestStream.Close(); string tokenResponse = null; using (var webTokenResponse = tokenRequest.GetResponse() as HttpWebResponse) { using (var reader = new StreamReader(webTokenResponse.GetResponseStream())) { tokenResponse = reader.ReadToEnd(); } } var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); var response = serializer.Deserialize<OAuthResponse>(tokenResponse); var oauthToken = response.access_token; refreshToken = response.refresh_token; var tokenExpiresUtc = DateTime.UtcNow.AddSeconds(response.expires_in);
使用访问令牌发出 REST 请求
收到访问令牌后,客户端应用程序可以使用访问令牌生成用于授权 REST 请求的授权标头。以下示例演示如何生成授权标头并发出 REST 请求:
var oauthToken = response.access_token; var refreshToken = response.refresh_token; var tokenExpiresUtc = DateTime.UtcNow.AddSeconds(response.expires_in); var oauthKey = String.Format("{0} {1}", "OAuth", oauthToken); //Build the REST request var restRequest = WebRequest.Create("https://mylimyeesite.com/api/v1/info.json") as HttpWebRequest; restRequest.Method = "Get"; restRequest.Headers.Add("Authorization", oauthKey); string restResponse = null; using (var webRESTResponse = (HttpWebResponse)restRequest.GetResponse()) { var stream = webRESTResponse.GetResponseStream(); if (stream != null) { using (var reader = new StreamReader(stream)) { restResponse = reader.ReadToEnd(); } } }
使用 API 密钥和用户名对 REST 请求进行身份验证
当使用 API 密钥和用户名从您的应用程序访问 Limyee 电商平台站点时,应用程序负责存储有效的用户名和 API 密钥,并将该信息传递到 Limyee 电商平台站点。执行此操作时,访问 REST API 的每个用户都需要一个 API 密钥。服务帐户 van 还用于限制权限的维护开销。这要求应用程序只需要存储有效的用户名,并在请求上使用服务帐户 API 密钥和用户名进行身份验证。然后,将向 HTTP 标头添加一个模拟标头,其中包含被模拟用户的用户名。
生成平台 API 密钥
- 登录后,单击右上角的"设置"以转到设置页面
- 单击"站点选项"选项卡,然后滚动到底部
- 单击"创建和编辑应用程序密钥"
- 为密钥填写"名称",例如"管理密钥"
- 复制或记下生成的密钥。
使用 API 密钥进行身份验证
要使用 API 令牌进行身份验证,必须传递头数据 Rest-User-Token。Rest-User-Token 是标识访问 REST API 的用户的用户令牌。它是用户的 API 密钥、冒号和用户用户名的 base64 编码串联。
下面是使用 Rest-User-Token 的 REST API GET 请求的示例实现:
var request = WebRequest.Create("https://mylimyeesite.com/api/v1/info.json") as HttpWebRequest; request.Method = "Get"; // replace the "admin" and "Admin's API key" with your valid user and apikey! var adminKey = String.Format("{0}:{1}", "Admin's API key", "admin"); var adminKeyBase64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(adminKey)); request.Headers.Add("Rest-User-Token", adminKeyBase64); var response = request.GetResponse() as HttpWebResponse;
使用 API 密钥进行身份验证时模拟用户
如果 Rest-User-Token 标头定义的用户具有模拟其他用户的权限,则可以将 Rest-Impersonate-User 标头设置为应模拟的用户的用户名。模拟时,通过 REST API 执行的任何操作都是代表模拟用户完成的。
下面是使用 Rest-User-Token 和 Rest-Impersonate-User 的 REST API GET 请求的示例实现:
var request = WebRequest.Create("https://mylimyeesite.com/api/v1/info.json") as HttpWebRequest; request.Method = "Get"; // replace the "admin" and "Admin's API key" with your valid user and apikey! var adminKey = String.Format("{0}:{1}", "u9rsrtkgfmt9qtqgct2fi9acc8zl8g", "admin"); var adminKeyBase64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(adminKey)); request.Headers.Add("Rest-User-Token", adminKeyBase64); // Add the impersonation header. Replace the "RandomUser" with the username of the user you are impersonating. request.Headers.Add("Rest-Impersonate-User", "RandomUser"); var response = request.GetResponse() as HttpWebResponse;
API 密钥的安全注意事项
API密钥是迄今为止最容易实现的解决方案,但它也是最不安全的。首先,API 密钥不会过期,并且依赖于用户在密钥变得不可用之前将其删除。此外,在能够模拟的帐户上使用API时,具有该密钥的任何人都可以模拟其他用户。由于 API 密钥是作为标头发送的,因此如果不在安全 (HTTPS) 连接上使用,则很容易被截获。
虽然 API 密钥尚未弃用或过时,但被视为旧版功能,建议不要将其用于生产代码。通常,建议仅在 OAuth 不是一个合理的选项时才在维护或实用程序应用程序中使用 API 密钥。