在 oAuth1 Twitter 登录的客户端中放置 TWITTER_CONSUMER_KEY / SECRET 是否存在安全漏洞?

Is it a security vulnerability to put TWITTER_CONSUMER_KEY / SECRET in client for oAuth1 Twitter Login?

我发现的所有 React Native Twitter 登录客户端似乎都将 TWITTER_CONSUMER_KEY 和 TWITTER_CONSUMER_SECRET 硬编码到客户端代码中,而不是依赖服务器生成令牌 and/or 推特重定向 URL.

根据 Twitter 的文档,这似乎不是正确的方法: "In the event that you believe that your API keys has been exposed, you should regenerate your API keys by following these steps" - Authentication best practices

指定消费者 key/secret 应该被硬编码的示例:

相关问题:

Is it a security vulnerability

是的。

您的应用可能会受到速率限制或标记为 malware/spam 等

Is there a better / more secure way?

基本上只需要正确完成您自己的站点身份验证 (oauth2) 并代理来自您客户的特定请求,经过验证或简化的锁定站点 API 然后转换为 Twitter API.

这是为什么,Twitter 应用程序专用身份验证支持 OAuth2,允许安全协商握手,然后使用 Bearer 令牌发出请求。在此模式下,您可以代表您的应用程序发出请求,但无需登录用户。所以不能 post 推文或查看私人帐户或阅读 DM。

对于用户身份验证,Twitter 仅支持 OAuth1 并且应用程序和用户都经过身份验证,但使用假定纯文本 http 的模型,因此不能共享单个令牌。每个请求都需要使用消费者 key/secret 进行并签署请求。所以没有办法从 javascript 客户端安全地执行此操作。

Is this safe?

绝对不是。坏人可以让用户通过 Twitter 进行身份验证以接收他们的令牌凭据,然后使用您的应用程序的消费者 key/secret(这将以纯文本形式提供)伪装成您的应用程序来执行各种令人讨厌的事情。

Is this the correct way to do it?

鉴于上述安全漏洞,不。

Is there a better / more secure way?

我目前正在尝试弄清楚如何安全地实现 Twitter 身份验证。这涉及大量阅读,但看起来好像没有您自己的后端是不可能的。我会尝试解释原因:

  1. 您的目标是接收用户的email/Twitter-ID
  2. 要实现 (1),您需要向 GET account/verify_credentials 端点 (https://developer.twitter.com/en/docs/twitter-api/v1/accounts-and-users/manage-account-settings/api-reference/get-account-verify_credentials) 发送请求。
  3. 要执行 (2),您需要提供授权 header,它由多个项目构成,包括用户的 OAuth 令牌以及您的应用程序的消费者 key/secret。更多信息在这里:https://developer.twitter.com/en/docs/authentication/oauth-1-0a/authorizing-a-request.
  4. 您使用三足式 OAuth 流程检索用户的 OAuth 令牌 此处描述:https://developer.twitter.com/en/docs/authentication/oauth-1-0a/obtaining-user-access-tokens. The first step of this process is to send a POST request to the oauth/request_token endpoint (https://developer.twitter.com/en/docs/authentication/api-reference/request_token)。 此端点本身需要使用 header 构造的授权 您应用的消费者 key/secret.

显然您不能执行步骤 (4),因为这意味着您可以在客户端中使用您的消费者机密;即使它不是硬编码的,它也必须在运行时在内存中,在某个时候

一旦您拥有自己的后端服务,您的客户端应用程序的一个选择是打开浏览器并定向到此服务上的端点(我们称之为 /auth/twitter),该端点将执行上述所有步骤以上。

该服务还可以实现另一个端点 (/auth/twitter/token),它处理对回调 URL 的请求,您在 Twitter 应用程序设置中进行了设置。此回调 URL 用作同一三足流的一部分。该端点将拥有继续检索用户的 email/Twitter-ID.

所需的所有信息

最后,/auth/twitter/token 可以重定向到自定义 URL,您的客户端应用程序需要将其作为其 URL 方案的一部分进行处理。它可以通过参数包含足够的信息,以便您的应用程序根据需要继续运行 post-auth。