Paw 未从 OAuth 代理中找到 access_token
Paw not finding access_token from OAuth proxy
我有一个用例,在执行 OAuth 2 身份验证时,我需要在本地欺骗列入白名单的重定向 URL。
我是 运行 一个非常基本的网络服务器,还有一个我要欺骗的域的主机文件条目。我能够正确协商我的令牌并将它们 return 给 Paw,但 Paw 没有接收我的 access_token
或 refresh_token
,它只是显示原始响应:
这是我的服务器代码(带有敏感数据的占位符):
var http = require('http'),
request = require('request');
var PORT = 6109;
var server = http.createServer(function(req, res) {
var code = req.url.split('?')[1].split('=')[2];
request({
url: 'https://<access token URL>/oauth2/token?code=' + code,
method: 'POST',
form: {
'client_id': <client_id>,
'client_secret': <client_secret>,
'grant_type': 'authorization_code',
'redirect_uri': <spoofed redirect URL>
}
}, function(err, response, data) {
data = JSON.parse(data);
res.writeHead(200, {'Content-Type': 'application/json'});
res.write(JSON.stringify(data.result));
// I also tried this with the same end-result
// res.writeHead(200);
// res.write('access_token=' + data.result.access_token + '&token_type=' + data.result.token_type + '&refresh_token=' + data.result.refresh_token);
res.end();
});
});
server.listen(PORT, function() {
console.log('Server listening on port %d', PORT);
});
我错过了什么? 为什么 Paw 找不到我的代币?
这是我的配置供参考:
其他一些值得注意的点:
- OAuth 提供程序是非标准的,并且在规范中有很多问题(我的代理存在部分是为了修补非标准位)
- 重定向的域 URL 是真实的,但是 URL 没有解析(这是本地主机条目的部分原因)
- 我没有显示这部分流程,但我在获得
code
值 之前正确完成了授权步骤
我认为您可能对授权 URL 和访问令牌 URL 感到困惑。当您处于 OAuth 2 的 授权代码 授权类型时,您应该在网页中有一个用户确认步骤(授权 URL)。
这让我猜想,您反而希望使用密码授予或客户端凭据?否则,如果您想使用授权 URL,您需要在授权 URL.
处指定一个网页
注意:我已经使用我提到的最后两个授权(密码授权和客户端凭据)在 Paw 中尝试了您的 Node.js 脚本,并且效果很好。
更新: 看了下面的评论,我更明白你在做什么了。 授权请求 应该(如果成功)return 对 Redirect URL 页面的 302 重定向响应,并附加一个code
URL 查询参数。看起来你 return 正在用 code
进行 JSON 响应,所以 Paw 没有捕捉到它。
根据OAuth 2.0 spec (RFC 6749), section *4.1.2。授权响应*,如果授予,code
应作为 URL 查询参数(即 URL 中的 ?key=value
参数)传递给重定向 URL进行重定向时。
If the resource owner grants the access request, the authorization
server issues an authorization code and delivers it to the client by
adding the following parameters to the query component of the
redirection URI using the "application/x-www-form-urlencoded" format
引用规范中的示例,如果授权请求成功(代码已授予),授权请求的响应应如下所示:
HTTP/1.1 302 Found
Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA
&state=xyz
我看到重定向 URL 包含 "my Spoofed Uri"。
当我们需要使用授权码流时,我们提供授权码和重定向Uri。
当您提供的 URI 与身份服务器中为客户端保存的 URI 不匹配时,您将无法获得令牌,因为 URI 与客户端授权码不匹配。
例如:考虑身份服务器中的客户端身份是:
Auth Code: "xyx"
Redirect Uri: "www.mylocalhost.com\xyz"
在您的示例中,您提供的组合是:
Auth Code: "xyx"
Redirect Uri: "<my spoofed uri>"
由于这 2 个不匹配,因此不会收到令牌。
我相信如果您使用在身份服务器中向客户端注册的正确 URI,您将能够收到令牌。
我有一个用例,在执行 OAuth 2 身份验证时,我需要在本地欺骗列入白名单的重定向 URL。
我是 运行 一个非常基本的网络服务器,还有一个我要欺骗的域的主机文件条目。我能够正确协商我的令牌并将它们 return 给 Paw,但 Paw 没有接收我的 access_token
或 refresh_token
,它只是显示原始响应:
这是我的服务器代码(带有敏感数据的占位符):
var http = require('http'),
request = require('request');
var PORT = 6109;
var server = http.createServer(function(req, res) {
var code = req.url.split('?')[1].split('=')[2];
request({
url: 'https://<access token URL>/oauth2/token?code=' + code,
method: 'POST',
form: {
'client_id': <client_id>,
'client_secret': <client_secret>,
'grant_type': 'authorization_code',
'redirect_uri': <spoofed redirect URL>
}
}, function(err, response, data) {
data = JSON.parse(data);
res.writeHead(200, {'Content-Type': 'application/json'});
res.write(JSON.stringify(data.result));
// I also tried this with the same end-result
// res.writeHead(200);
// res.write('access_token=' + data.result.access_token + '&token_type=' + data.result.token_type + '&refresh_token=' + data.result.refresh_token);
res.end();
});
});
server.listen(PORT, function() {
console.log('Server listening on port %d', PORT);
});
我错过了什么? 为什么 Paw 找不到我的代币?
这是我的配置供参考:
其他一些值得注意的点:
- OAuth 提供程序是非标准的,并且在规范中有很多问题(我的代理存在部分是为了修补非标准位)
- 重定向的域 URL 是真实的,但是 URL 没有解析(这是本地主机条目的部分原因)
- 我没有显示这部分流程,但我在获得
code
值 之前正确完成了授权步骤
我认为您可能对授权 URL 和访问令牌 URL 感到困惑。当您处于 OAuth 2 的 授权代码 授权类型时,您应该在网页中有一个用户确认步骤(授权 URL)。
这让我猜想,您反而希望使用密码授予或客户端凭据?否则,如果您想使用授权 URL,您需要在授权 URL.
处指定一个网页注意:我已经使用我提到的最后两个授权(密码授权和客户端凭据)在 Paw 中尝试了您的 Node.js 脚本,并且效果很好。
更新: 看了下面的评论,我更明白你在做什么了。 授权请求 应该(如果成功)return 对 Redirect URL 页面的 302 重定向响应,并附加一个code
URL 查询参数。看起来你 return 正在用 code
进行 JSON 响应,所以 Paw 没有捕捉到它。
根据OAuth 2.0 spec (RFC 6749), section *4.1.2。授权响应*,如果授予,code
应作为 URL 查询参数(即 URL 中的 ?key=value
参数)传递给重定向 URL进行重定向时。
If the resource owner grants the access request, the authorization server issues an authorization code and delivers it to the client by adding the following parameters to the query component of the redirection URI using the "application/x-www-form-urlencoded" format
引用规范中的示例,如果授权请求成功(代码已授予),授权请求的响应应如下所示:
HTTP/1.1 302 Found
Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA
&state=xyz
我看到重定向 URL 包含 "my Spoofed Uri"。
当我们需要使用授权码流时,我们提供授权码和重定向Uri。
当您提供的 URI 与身份服务器中为客户端保存的 URI 不匹配时,您将无法获得令牌,因为 URI 与客户端授权码不匹配。
例如:考虑身份服务器中的客户端身份是:
Auth Code: "xyx"
Redirect Uri: "www.mylocalhost.com\xyz"
在您的示例中,您提供的组合是:
Auth Code: "xyx"
Redirect Uri: "<my spoofed uri>"
由于这 2 个不匹配,因此不会收到令牌。
我相信如果您使用在身份服务器中向客户端注册的正确 URI,您将能够收到令牌。