我正在使用OAuth2.0在PHP中设计API。我的最终目标是在javascript(使用AngularJS)中构建一个直接访问此API的前端应用程序。我知道传统上没有办法在javascript中保护交易,因此直接访问API是不可行的。前端需要与服务器代码进行通信,而服务器代码又直接与API通信。但是,在研究OAuth2时,看起来用户代理流程似乎是为了帮助解决这种情况。
我需要帮助的是在javascript中实现OAuth2用户代理流程(特别是AngularJS,如果可能的话,因为我正在使用我的前端)。我无法找到任何这样做的示例或教程。我真的不知道从哪里开始,不想阅读整个OAuth2规范,至少没有看到我将要做的事情的例子。因此,非常感谢任何示例,教程,链接等。
答案 0 :(得分:50)
Implicit Grant flow(您称之为用户代理流的那个)正是要走的路:
隐式授权是为使用脚本语言(如JavaScript)在浏览器中实现的客户端优化的简化授权代码流。
要了解这一流程,Google提供的client-side applications文档是一个非常好的起点。请注意,他们建议您执行额外的令牌验证步骤以避免confused deputy problems。
以下是使用Soundcloud API和jQuery的简短示例实现,取自this answer:
<script type="text/javascript" charset="utf-8">
$(function () {
var extractToken = function(hash) {
var match = hash.match(/access_token=([\w-]+)/);
return !!match && match[1];
};
var CLIENT_ID = YOUR_CLIENT_ID;
var AUTHORIZATION_ENDPOINT = "https://soundcloud.com/connect";
var RESOURCE_ENDPOINT = "https://api.soundcloud.com/me";
var token = extractToken(document.location.hash);
if (token) {
$('div.authenticated').show();
$('span.token').text(token);
$.ajax({
url: RESOURCE_ENDPOINT
, beforeSend: function (xhr) {
xhr.setRequestHeader('Authorization', "OAuth " + token);
xhr.setRequestHeader('Accept', "application/json");
}
, success: function (response) {
var container = $('span.user');
if (response) {
container.text(response.username);
} else {
container.text("An error occurred.");
}
}
});
} else {
$('div.authenticate').show();
var authUrl = AUTHORIZATION_ENDPOINT +
"?response_type=token" +
"&client_id=" + clientId +
"&redirect_uri=" + window.location;
$("a.connect").attr("href", authUrl);
}
});
</script>
<style>
.hidden {
display: none;
}
</style>
<div class="authenticate hidden">
<a class="connect" href="">Connect</a>
</div>
<div class="authenticated hidden">
<p>
You are using token
<span class="token">[no token]</span>.
</p>
<p>
Your SoundCloud username is
<span class="user">[no username]</span>.
</p>
</div>
使用AngularJS发送XMLHttpRequests(ajax()
函数在jQuery中的功能),请参阅$http
service的文档。
如果要保留状态,在将用户发送到授权端点时,请查看state
参数。
答案 1 :(得分:1)
有一个Authorization Code Grant
方法从OAuth服务器获取令牌的示例。我使用jQuery($
)来进行一些操作。
首先,将用户重定向到授权页面。
var authServerUri = "http://your-aouth2-server.com/authorize",
authParams = {
response_type: "code",
client_id: this.model.get("clientId"),
redirect_uri: this.model.get("redirectUri"),
scope: this.model.get("scope"),
state: this.model.get("state")
};
// Redirect to Authorization page.
var replacementUri = authServerUri + "?" + $.param(authParams);
window.location.replace(replacementUri);
当一个人获得授权通行证以获得令牌时:
var searchQueryString = window.location.search;
if ( searchQueryString.charAt(0) === "?") {
searchQueryString = searchQueryString.substring(1);
}
var searchParameters = $.deparam.fragment(searchQueryString);
if ( "code" in searchParameters) {
// TODO: construct a call like in previous step using $.ajax() to get token.
}
您可以使用jQuery或纯XMLHttpRequest以相同的方式实现Resource Owner Password Credentials Grant
,并且不进行任何重定向 - 因为在每次重定向时,您都会松散应用程序的状态。
对我来说,我使用HTML5本地存储来保存我的应用程序状态,这些数据不太可能构成安全威胁。