我正在尝试使用Parse Cloud Code和Xcode(swift)从Spotify请求访问/刷新令牌。
var express = require("express"),
app = express(),
crypto = require('crypto'),
buffer = require('buffer'),
url = require('url');
var config = new Parse.Object("Config");
config.set("client_id", "");
config.set("client_secret", "");
config.set("callback_url", "");
config.set("endpoint", "https://accounts.spotify.com");
var AUTH_HEADER = "Basic " + new buffer.Buffer(config.get("client_id")+ ":" + config.get("client_secret")).toString("base64");
app.use(express.bodyParser());
Parse.Cloud.define("swap", function (req, res) {
if (!req.body || !req.body.hasOwnProperty("code")) {
res.status(550).send("Permission Denied");
return;
}
var form_data = {
"grant_type": "authorization_code",
"redirect_uri": config.get("callback_url"),
"code": req.body.code
};
Parse.Cloud.httpRequest({
method: "POST",
url: url.resolve(config.get("endpoint"), "/api/token"),
headers: {
"Authorization": AUTH_HEADER,
"Content-Type": "application/x-www-form-urlencoded"
},
body: form_data,
success: function(httpResponse) {
if (httpResponse.status != 200) {
res.status(550).send("Permission Denied");
return;
}
var token_data = JSON.parse(httpResponse.text);
res.status(200).set({
"Content-Type": "application/json"
}).send(token_data);
},
error: function(httpResponse) {
res.status(500).send("Internal Server Error");
return;
}
});
});
Parse.Cloud.define("refresh", function (req, res) {
if (!req.body || !req.body.hasOwnProperty("refresh_token")) {
res.status(550).send("Permission Denied");
return;
}
var refresh_token = req.body.refresh_token;
var form_data = {
"grant_type": "refresh_token",
"refresh_token": refresh_token
};
Parse.Cloud.httpRequest({
method: "POST",
url: url.resolve(config.get("endpoint"), "/api/token"),
headers: {
"Authorization": AUTH_HEADER,
"Content-Type": "application/x-www-form-urlencoded"
},
body: form_data,
success: function(httpResponse) {
if (httpResponse.status != 200) {
res.status(550).send("Permission Denied");
return;
}
res.status(httpResponse.status).set({
"Content-Type": "application/json"
}).send(httpResponse.text);
},
error: function(httpResponse) {
res.status(500).send("Internal Server Error");
return;
}
});
});
Parse.Cloud.define("api/token", function (req, res) {
res.status(200).set({
"Content-Type": "application/json"
});
switch (req.body.grant_type) {
case "authorization_code": {
res.status(200).set({
"Content-Type": "application/json"
}).send({
"refresh_token": "REFRESH TOKEN"
});
} break;
case "refresh_token": {
res.status(200).set({
"Content-Type": "application/json"
}).send({
"access_token": "ACCESS TOKEN"
});
} break;
default: {
res.status(550).set({
"Content-Type": "text/html"
}).send("<html><body><h1>Access Denied</h1></body></html>");
} break;
}
});
app.listen();
用Xcode调用Xcode中的函数:
PFCloud.callFunctionInBackground("swap", withParameters: nil) { (results, error: NSError?) -> Void in
if error != nil {
// Your error handling here
print(error)
} else {
// Deal with your results (votes in your case) here.
print(results)
}
}
我收到以下错误:
[错误]:TypeError:对象#没有方法&#39; status&#39; at main.js:29:13(代码:141,版本:1.9.1) 可选(错误域=解析代码= 141&#34; TypeError:对象#没有方法&#39; status&#39; 在main.js:29:13&#34; UserInfo = {code = 141,temporary = 0,error = TypeError:Object#没有方法&#39; status&#39; 在main.js:29:13,NSLocalizedDescription = TypeError:对象#没有方法&#39; status&#39; 在main.js:29:13})
谢谢!
答案 0 :(得分:1)
在处理完这些确切的代码并试图让它工作之后,我终于意识到它是node.js代码,而不是Parse云代码。如果您仍想使用它,我建议阅读Parse关于在Parse中使用node.js的文档。否则,你最好还做其他事情,比如在Heroku上启动Spotify提供的ruby脚本。
如果您感觉更冒险,可以尝试将代码移植到Parse Cloud代码格式,但这似乎相当困难