雅虎OAuth2隐式授权流程在新的雅虎应用程序中无法工作

8
我有现有的Web应用程序和专用Yahoo App正在运行。它使用OAuth2 Implicit Grant Flow
现在,我想设置另一个域名以相同的原理工作。我已经创建了新的Yahoo App,带有新的回调域名New Yahoo app
用于获取用户同意的URL(在两种情况下)为https://api.login.yahoo.com/oauth2/request_auth?client_id=consumer_key&redirect_uri=https://redir_url&response_type=token
它适用于旧域和旧的Yahoo应用程序(Consumer key以--结尾)。但由于某些原因,它不想与新域和新的Yahoo应用程序一起工作(消费者密钥不以--结尾)。

访问用户同意链接后,我收到了以下信息:

开发者:请从代码、令牌或id_token中选择响应类型并重新提交。

尽管我提供了有效的response_token,但它为什么在新域和新Yahoo应用程序上无法工作?

代码:

var authorizationUrl = 'https://api.login.yahoo.com/oauth2/request_auth'
            + '?client_id=' + encodeURIComponent(consumerKey)
            + '&redirect_uri=' + encodeURIComponent(redirectUri)
            + '&response_type=token';

window.open(authorizationUrl, '_blank', 'location=yes,height=570,width=650,scrollbars=yes,status=yes');

你能分享一下你的代码示例吗?在两个实例中都提供一下。 - tshimkus
1
你找到任何解决方案了吗?我现在也面临同样的问题,看起来Yahoo!在OAuth实现中进行了一些未记录的更改。 - Vishnu Haridas
@tshimkus,源代码相同,只是client_id不同。已添加代码。 - Andriy F.
@VishnuHaridas 还没有。 - Andriy F.
3个回答

2
看起来API正在要求响应类型参数为文字“id_token”(或“code”或“token”)。您没有发布您的代码,但听起来您实际上是将响应令牌ID值放入该参数中。
查看Yahoo API文档,这里有一个类似于您的示例URL:

https://api.login.yahoo.com/oauth2/request_auth?client_id=dj0yJmk9WGx0QlE0UWdCa0hKJmQ9WVdrOWNrNUhXVnBhTkhFbWNHbzlNQS0tJnM9Y29uc3VtZXJzZWNyZXQmeD01OA--&response_type=id_token&redirect_uri=https://yahoo.com&scope=openid%20mail-r&nonce=YihsFwGKgt3KJUh6tPs2

您可以看到他们写的是:&response_type=id_token,而不是&response_type=934984kklsdkjklfs或类似的内容。
一般来说,OAuth API调用通常会返回一个访问令牌或响应令牌,该令牌在您的API会话中有效,并最终过期。此参数描述了您希望API返回的令牌类型。
我无法确定您的应用程序的2个版本之间可能发生了什么变化,但我建议您查看Yahoo API文档的版本控制更新内容部分。

  1. 我的应用程序有相同的版本,只是针对不同环境使用不同的密钥。
  2. 我使用正确的 response_type=token
  3. 我需要 response_type=token 而不是 response_type=id_token。我使用了不同的工作流程 https://developer.yahoo.com/oauth2/guide/flows_implicitgrant/。但是我测试了你提到的那个,它也不能与新密钥一起使用。
- Andriy F.

0

看起来他们不再支持这个流程:

由于OAuth2 Implicit流程中存在许多安全漏洞,因此已弃用对该流程的支持。请使用OAuth2 Authorization Code流程,如此处所述。

通过文档,看起来他们仅支持授权码流程

根据OAuth 2.0规范,可以使用四种授权类型之一来获取访问用户(资源所有者)数据的授权。Yahoo目前仅支持其中一种授权类型:

  • 授权码授权:此授权类型用于获取访问令牌,可用于授权访问Yahoo API。

这可能不适用于客户端应用程序

当您拥有服务器端(Web)应用程序时,应使用此流程。

0

您可以向response_type参数提供2个不同的值。

如果response_type=token - 重定向后,您的重定向URL应附加访问令牌,如下所示:

http://myurl/?access_token=XXXYYY

然而 - 这被认为比另一种方式不太安全,因为在这种情况下,您将暴露访问令牌。(例如,浏览器插件可能会访问URL - 然后他们可以利用这一点)

如果response_type=code - 您的重定向URL应附加一个代码,如下所示:

https://myurl/?code=XXXYYY

然后,您将从服务器端检索该代码,并将其与您的client_id和client_secret一起发送到OAuth2提供程序(Yahoo在本例中)以换取访问令牌。这更安全,因为只有您的服务器端现在可以访问访问令牌,而没有其他机制。通常,它将是像这样的某个雅虎端点的post请求:

http.post(
  url: 'someyahoourl', /* probably something like https://api.login.yahoo.com/oauth2/request_auth */
  data:
  {
     client_secret: yourclientsecret,
     client_id: yourclientid, /* Judging by the url it's dj0yJmk9WGx0QlE0UWdCa0hKJmQ9WVdrOWNrNUhXVnBhTkhFbWNHbzlNQS0tJnM9Y29uc3VtZXJzZWNyZXQmeD01OA-- */
     code: thecodefromurl,
     grant_type: 'authorization_code',
     redirect_uri: the redirect uri that you've retrieved the code from
  }

然后您的服务器将在响应此请求时获取access_token。


  1. 我使用这个工作流程 https://developer.yahoo.com/oauth2/guide/flows_implicitgrant/,所以我需要 response_type=tiken。
  2. 重定向没有发生。在我应该被重定向的时候,用户看到了消息“开发人员:请从代码、令牌或 id_token 中选择响应类型并重新提交”。
- Andriy F.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接