【问题标题】:Programmatic authentication with oauth2使用 oauth2 进行编程式身份验证
【发布时间】:2019-11-26 01:58:35
【问题描述】:

我们使用一些组织的 API 有一段时间了,但现在他们开始使用 OAuth2 进行身份验证。他们的 API 完全由我们的应用程序以编程方式使用。所以现在我们必须使用 OAuth2 进行身份验证,这样我们才能再次使用他们的 API。

我对这个身份验证过程有点困惑。有没有一种方法可以以编程方式使用 OAuth 进行身份验证?它说,在继续进行身份验证之前,将要求用户进行身份验证时登录,您如何仅从代码中实现此登录?或者您是否需要先使用浏览器进行身份验证,然后使用访问令牌来获取来自应用程序的进一步请求。这种场景下OAuth2认证的典型流程是什么?

编辑:只有一个用户是我们的应用程序用于访问其数据的帐户。该用户最终注册为 API 的使用者。

【问题讨论】:

  • 你的应用或者调用api的部分是做什么的?它是一些后台或独立于用户的工作,还是代表用户调用 api? api 提供者是否知道用户或需要一些 SSO 登录,例如通过谷歌、Facebook 等?
  • 在不知道你真正需要什么的情况下:一般来说,OAuth 当然可以以编程方式使用(无需用户交互)。
  • @Thomas API 用于从他们的服务器访问我们解析的一些 xml 响应,这是每天在某个时间完成的计划作业。只有一个用户是我们应用程序使用的帐户,没有其他用户,因此 API 提供者知道我们的帐户,它被注册为 API 的消费者。
  • 好吧,在这种情况下,我会说您需要“密码”流程或“客户端凭据”流程(您可以查找它们)。哪个适合您的需求取决于 api 的配置方式:如果您的应用程序只是从 api 的角度来看的“用户”,那么我会说使用“密码”流程(api 应该为此提供一些登录机制 - 你'd login 以获取您在后续请求期间发回的访问令牌) - 如果您的应用程序是服务提供者(客户端),“客户端凭据”流程应该足够了(如果 api 支持它)。
  • @Thomas 从他的问题和 cmets 中所说,我假设他想使用 client_credentials 流程。

标签: java authentication oauth oauth-2.0 meetup


【解决方案1】:

您混淆了不同的 OAuth 流程。用户进行身份验证的流程通常是 authentication_code 流程,而您要使用的应该是 client_credentials 流程。

我们将您的应用程序称为“A”,将您正在使用其服务的组织称为“B”。

在 client_credentials 流程中,A 会将他的 client_id 和 client_secret 发送到 B 的授权服务器。该服务器将返回一个访问令牌,您现在可以使用它来调用 B 的资源服务器(服务本身)。

+---------------+          +------------------+
| Application A |    1     | Authorization    |
|               +----------+ serveur          |
+---------------+    2     +------------------+



+---------------+          +------------------+
| Application A |    3     |Resource Server   |
|               +----------+                  |
+---------------+    4     +------------------+

  1. 带有 client_id 和 client_secret 的令牌请求
  2. 令牌响应:带有 access_token 的 json
  3. 标头为“Authorization: Bearer”的服务请求
  4. 服务响应如常。

令牌请求通常具有以下格式:

POST /token HTTP/1.1
Host: authorization-server.com

grant_type=client_credentials
&client_id=xxxxxxxxxx
&client_secret=xxxxxxxxxx 

但有些人可能会选择强制执行另一个选项:在授权标头中传递客户端信息:

POST /token HTTP/1.1
Host: authorization-server.com
Authorization: Basic base64(client_id:client_secret)

grant_type=client_credentials

Base64 在这里是函数,而不是文字字符串。

【讨论】:

    【解决方案2】:

    我对这个问题和 Turtle 的回答都投了赞成票。我认为任何像我一样查询过这个问题的人也会受益于:

    https://auth0.com/docs/authorization/flows/which-oauth-2-0-flow-should-i-use

    有不同的流程。在代码之前在盒子/握手图中考虑它们。

    【讨论】:

      猜你喜欢
      • 2012-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-29
      • 2013-06-24
      • 1970-01-01
      相关资源
      最近更新 更多