流动应用程式认证

Mobile App Authentication

我创建了一个使用我的网络 api 的移动应用程序(因此我拥有该应用程序和 api)。为此,我使用了 oauth2 用户凭据授予 - 根据:https://bshaffer.github.io/oauth2-server-php-docs/grant-types/user-credentials/

这允许用户使用正常的网站凭据(用户名/密码)登录应用程序。然后应用程序从网站接收一个不记名令牌,这个不记名令牌用于与网络交互api。

我的问题是,如何限制我的网站 api 以便只有我的应用程序可以使用它?目前,其他人可以开发其他使用我的 api 的应用程序,因为该应用程序本身未获得授权(它仅使用网站用户的 username/password)。

Play 商店/iOS 应用程序在发布时是否会获得唯一 ID?我可以使用它来验证发出 api 请求的应用程序?

感谢任何帮助。

干杯, 奥利

因为客户端的任何东西本质上都会受到损害,所以我们必须更深入地研究决定客户端真实性的因素。当然,最明显的是客户机密。但是,由于这是一个客户端应用程序,因此无法启动,因为任何具有合理知识的人都可以检查源代码以找到它。

然而,许多人忽略的是,客户端也有一个特定的、唯一的重定向 URI,该 URI 在配置时确定。因此,如果您向平台注册重定向 URI(iOS、Android 等),则只有您的客户端才能成功完成流程。

不幸的是,这不足以阻止真正专注的攻击者。如果攻击者设法在客户端设备上安装应用程序并注册重定向 URI,它可以拦截授权令牌并参与流程:

+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
| End Device (e.g., Smartphone)  |
|                                |
| +-------------+   +----------+ | (6) Access Token  +----------+
| |Legitimate   |   | Malicious|<--------------------|          |
| |OAuth 2.0 App|   | App      |-------------------->|          |
| +-------------+   +----------+ | (5) Authorization |          |
|        |    ^          ^       |        Grant      |          |
|        |     \         |       |                   |          |
|        |      \   (4)  |       |                   |          |
|    (1) |       \  Authz|       |                   |          |
|   Authz|        \ Code |       |                   |  Authz   |
| Request|         \     |       |                   |  Server  |
|        |          \    |       |                   |          |
|        |           \   |       |                   |          |
|        v            \  |       |                   |          |
| +----------------------------+ |                   |          |
| |                            | | (3) Authz Code    |          |
| |     Operating System/      |<--------------------|          |
| |         Browser            |-------------------->|          |
| |                            | | (2) Authz Request |          |
| +----------------------------+ |                   +----------+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+

因此,RFC 7636 规定了对 OAuth2 框架的 Proof Key for Code Exchange by OAuth Public Clients(PKCE,或“pixy”)扩展。从本质上讲,PKCE 的工作原理是让客户端告诉授权服务器知道如何将代码与一组特定的材料相关联,例如拥有证明但范围缩小。

客户端在请求授权码时额外发送两个参数:验证码和验证码方法。代码质询由称为代码验证程序的加密随机字符串组成。 code verifier和code challenge方法一起用于将下发的授权码绑定到授权请求上。

                                             +-------------------+
                                             |   Authz Server    |
   +--------+                                | +---------------+ |
   |        |--(A)- Authorization Request ---->|               | |
   |        |       + t(code_verifier), t_m  | | Authorization | |
   |        |                                | |    Endpoint   | |
   |        |<-(B)---- Authorization Code -----|               | |
   |        |                                | +---------------+ |
   | Client |                                |                   |
   |        |                                | +---------------+ |
   |        |--(C)-- Access Token Request ---->|               | |
   |        |          + code_verifier       | |    Token      | |
   |        |                                | |   Endpoint    | |
   |        |<-(D)------ Access Token ---------|               | |
   +--------+                                | +---------------+ |
                                             +-------------------+

大多数 OAuth2 提供程序都实施 PKCE 流程,并且有大量在线资源可以提供更多详细信息。从 RFC 开始,如果您需要说明,请查看其他一些资源: