是否可以在没有重定向服务器的情况下使用 OAuth 2.0?

2022-09-01 02:06:38

我正在尝试创建一个与 SurveyMonkey API 交互的基于 Java 的本地客户端。

SurveyMonkey 需要使用 OAuth 2.0 的长寿命访问令牌,我对此不是很熟悉。

我已经在谷歌上搜索了几个小时,我认为答案是否定的,但我只想确定:

我是否可以编写一个与 SurveyMonkey 交互的简单 Java 客户端,而无需在某些云中设置自己的重定向服务器

我觉得拥有自己的在线服务是强制性的,以便能够接收OAuth 2.0生成的持有者令牌。有没有可能我不能让 SurveyMonkey 直接向我的客户发送持有者令牌?

如果我在某个地方设置自己的自定义Servlet,并将其用作redirect_uri,那么正确的流程将如下所示:

  1. 来自 SurveyMonkey 的 Java 客户端请求持有者令牌,redirect_uri是我自己的自定义 servlet URL。
  2. SurveyMonkey 将令牌发送到我的自定义 Servlet URL。
  3. Java 客户端轮询定制 servlet URL,直到令牌可用?

这是正确的吗?


答案 1

是的,可以在没有回调 URL 的情况下使用 OAuth2。RFC6749 引入了多个流程。隐式授权代码授权类型需要重定向 URI。但是,资源所有者密码凭据授予类型不会。

自 RFC6749 起,已经发布了其他不需要任何重定向 URI 的规范:

  • RFC7522:OAuth 2.0 客户端身份验证和授权的安全断言标记语言 (SAML) 2.0 配置文件
  • RFC7523:用于 OAuth 2.0 客户端身份验证和授权的 JSON Web 令牌 (JWT) 配置文件
  • RFC8628:OAuth 2.0 设备授权

在任何情况下,如果上述授权类型不符合您的需求,则没有什么可以阻止您创建自定义授权类型


答案 2

不完全是,OAuth 流的全部意义在于用户(您代表其访问数据的客户端)需要授予您访问其数据的权限。

请参阅身份验证说明。您需要将用户发送到 OAuth 授权页面:

https://api.surveymonkey.net/oauth/authorize?api_key<your_key>&client_id=<your_client_id>&response_type=code&redirect_uri=<your_redirect_uri>

这将向用户显示一个页面,告诉他们您正在请求访问其帐户的哪些部分(例如,查看他们的调查,查看他们的回复等)。一旦用户通过单击该页面上的“授权”来批准,SurveyMonkey 将自动转到您设置为重定向 URI 的任何内容(确保上面网址中的 URI 与您在应用程序设置中设置的内容匹配)和代码。

因此,如果您的重定向 URL 是 ,SurveyMonkey 将使用代码将用户重定向到该 URL:https://example.com/surveymonkey/oauth

https://example.com/surveymonkey/oauth?code=<auth_code>

您需要获取该代码,然后通过执行 POST 请求来将其交换为访问令牌,并使用以下 post 参数:https://api.surveymonkey.net/oauth/token?api_key=<your_api_key>

client_secret=<your_secret>
code=<auth_code_you_just_got>
redirect_uri=<same_redirect_uri_as_before>
grant_type=authorization_code

这将返回一个访问令牌,然后可以使用该访问令牌访问用户帐户上的数据。不会将访问令牌提供给用户,供你用于访问用户帐户。无需轮询或任何内容。

如果你只是在访问自己的帐户,则可以使用应用的设置页中提供的访问令牌。否则,如果不设置自己的重定向服务器,就无法获取用户的访问令牌(除非所有用户都与您位于同一组中,即同一帐户下的多个用户;但我不会进入)。SurveyMonkey 需要一个地方在用户授权后向您发送代码,您不能只请求一个。


推荐