我刚刚开始使用 Soundcloud API,但在身份验证方面遇到了麻烦。我已经用 Yeoman 构建了我的 AngularJS 项目,并使用grunt server
它在浏览器中预览我的项目
http://localhost:9000/#/
那是index.html
我的 AngularJS 应用程序主页的 URL。我添加了以下callback.html
文件(在 Soundcloud API 文档中找到)
<!DOCTYPE html>
<html lang="en">
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Connect with SoundCloud</title>
</head>
<body onload="window.opener.setTimeout(window.opener.SC.connectCallback, 1)">
<b style="width: 100%; text-align: center;">This popup should automatically close in a few seconds</b>
</body>
</html>
在我的项目app
目录中,这是index.html
文件所在的位置。此外,在非理性的绝望中,我已将 AngularJS 应用程序配置为将callback.html
文件作为 URL 上的视图提供
http://localhost:9000/#/callback
我想也许它会这样找到它。我开始认为redirect_uri
必须托管在实际服务器上。我不确定 grunt 的服务器是否有资格作为可以在除本地以外的任何地方提供文件的服务器。
如果 redirect_uri
知道我的 callback.html
文件位于 app
我的 AngularJS 应用程序的目录中,我会是什么样子?
更新 1
我尝试了不同的 URL/URI 组合。
组合 1
在我的 Javascript 中:
redirect_uri: "http://localhost:9000/#/callback"
在我的应用设置中
http://localhost:9000/#/callback.html
组合 2
在我的 Javascript 中:
redirect_uri: "http://localhost:9000/#/callback.html"
在我的应用设置中
http://localhost:9000/#/callback.html
组合 3
在我的 Javascript 中:
redirect_uri: "http://localhost:9000/#/callback.html"
在我的应用设置中
http://localhost:9000/#/callback
此外,当我在 Chrome 中运行它时,我会在 Chrome 开发工具的控制台中看到此错误:
Uncaught SyntaxError: Unexpected identifier useranalyzr.js:4
正如您在我的useranalyzr.js
文件中看到的,第 4 行是redirect_uri
.
window.onload = function() {
SC.initialize({
client_id: '###################################'
redirect_uri: "http://localhost:9000/#/callback.html"
});
SC.connect(function(){
SC.put("/me/followings/12345", function(user, error) {
if(error){
alert("Error: " + error.message);
}else{
alert("You are now following " + user.username);
}
});
});
}
所以是的,无论我尝试什么组合,我总是会遇到同样的错误。我开始认为我需要找到一种方法来让 grunt 为静态 callback.html 文件提供服务,而不会妨碍 AngularJS 路由。只是直接链接。
更新 2
好的,我可以提供服务,callback.html
整个http://localhost:9000/callback.html
SC.connect 授权过程开始。我的浏览器被重定向到
https://soundcloud.com/connect?state=SoundCloud_Dialog_c3241&client_id=####################################&redirect_uri=http%3A%2F%2Flocalhost%3A9000%2Fcallback.html&response_type=code_and_token&scope=non-expiring&display=popup
然后我按连接以授权访问,然后浏览器重定向到callback.html
位于http://localhost:9000/callback.html
但附加了代码、状态和访问令牌的位置,就像这样
http://localhost:9000/callback.html?code=508aa0dd5ce3d0f4254157a487fc4826&state=SoundCloud_Dialog_c3241#access_token=1-46482-7907892-1328d9e0fc383baf&scope=non-expiring
加载该页面后,我会在 Dev Tools 控制台中看到一个错误
Uncaught TypeError: Cannot read property 'SC' of null
这正常吗?
此外,我不希望应用程序被重定向回callback.html
at,http://localhost:9000/callback.html
因为我的应用程序基于 myindex.html
或http://localhost:9000/#/
URL。我如何让它回到 http://localhost:9000/#/
?
我开始想也许是因为它无法访问 SoundCloud SDK,所以我输入了
<script src="http://connect.soundcloud.com/sdk.js"></script>
在中<head>
,callback.html
但错误仍然存在。
更新 3:更新 2 问题已解决
所以我在 Firefox 中试了一下,效果很好。实际上弹出了一个弹出窗口,要求我登录/连接。这样做之后,我的 callback.html 在弹出窗口中被调用,然后它按预期消失了。我的主应用程序窗口仍然存在,但具有用户身份验证。它在 Chrome 中不起作用的原因是因为弹出窗口一直被静默阻止,所以 Chrome 实际上会离开我的应用程序,转到登录/连接页面,在我按下连接后它会转到callback.html
. 我猜是因为它是一个窗口选项卡,它会像代码指示的那样消失。抱歉我的解释不好。仍然是 JS 和 SC API 的初学者。