我有一个用例,我需要在执行OAuth 2身份验证时在本地欺骗列入白名单的重定向URL。
我正在运行一个非常基本的网络服务器,加上我欺骗的域名的主机文件条目。我能够正确地协商我的令牌并将它们归还给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找不到我的代币?
这是我的配置供参考:
其他一些值得注意的要点:
code
值之前正确完成了授权步骤答案 0 :(得分:1)
我认为您可能在授权URL和访问令牌URL之间感到困惑。当您使用OAuth 2的授权码授予类型时,您需要在网页(授权网址)中设置用户确认步骤。
这让我觉得相反,您期望使用密码授予或客户端凭据?否则,如果您要使用授权URL,则需要在授权URL中指定网页。
注意:我已经使用我提到的两个最后授权(密码授予和客户端凭据)在Paw中尝试过你的Node.js脚本,它运行良好。
更新:根据以下评论,我了解您的更多信息。 授权请求应该(如果成功)向重定向URL 页面返回302重定向响应,并向其附加code
URL查询参数。看起来您正在使用code
返回JSON响应,因此Paw没有捕获它。
根据OAuth 2.0 spec (RFC 6749), section 4.1.2 。授权响应,如果被授予,code
应该在进行重定向时作为URL查询参数(即URL中的?key=value
参数)传递给重定向URL。
如果资源所有者授予访问请求,则授权 服务器发布授权代码并通过它将其传递给客户端 将以下参数添加到查询组件中 使用“application / x-www-form-urlencoded”格式重定向URI
引用规范中的示例,以下是授权请求的响应如果成功(代码被授予)应该如何:
HTTP/1.1 302 Found
Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA
&state=xyz
答案 1 :(得分:0)
我看到重定向网址包含&#34;我的Spoofed Uri&#34;。
当我们需要使用授权代码流时,我们提供授权代码并重定向Uri。
当您提供的URI与Identity Server中为客户端保存的URI不匹配时,您将无法获取令牌,因为URI与客户端授权代码不匹配。
例如:考虑身份服务器中的客户端身份是:
Auth Code: "xyx"
Redirect Uri: "www.mylocalhost.com\xyz"
在您的示例中,您提供的组合是:
Auth Code: "xyx"
Redirect Uri: "<my spoofed uri>"
由于这些2不会匹配,因此不会收到任何令牌。
我相信如果您使用在身份服务器中向客户端注册的正确URI,您将能够接收令牌。