我不讨厌 Oauth,但我讨厌自己无法理解这个概念。话虽如此,这是我的问题:我正在尝试从普通 javascript 调用 Office Graph REST api。因此,我从在我的 SharePoint Online 网站上运行的页面向 graph.microsoft.com 执行常规 XMLHttpRequest(因此,当我登录时,代码应该从我的安全上下文运行)。该调用返回 403 需要身份验证。我假设我必须在 Azure AD 中注册一个应用程序并且我已经这样做了,所以我有一个客户端 ID 和一个 secret 。但是,我找不到以编程方式下一步要做什么(我认为我理解这个概念,我必须获得一个 token ,我必须在调用 Graph api 时提供该 token )。似乎几乎所有内容都有大量示例代码,但 javascript 除外。有没有人指点一下?
更新: 我知道 token 的参与,这是我无法理解的部分(参见原始问题/评论);我有一个客户 ID,我有一个 secret ,我有这个(非常常见的)代码:
function graphRead(whatToRead) {
switch(whatToRead) {
case "userinfo" :
officeUser = JSON.Parse(loadXMLDoc("GET","https://graph.microsoft.com/v1.0/me"));
break;
default:
};
};
function loadXMLDoc(mMethod,uURL) {
var xmlhttp;
if (window.XMLHttpRequest) {
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
} else {
// code for IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == XMLHttpRequest.DONE ) {
if(xmlhttp.status == 200){
return(xmlhttp.responseText);
}
else if(xmlhttp.status == 400) {
alert('There was an error 400')
}
else {
alert('something else other than 200 was returned')
}
}
};
xmlhttp.open(mMethod, uURL, true);
xmlhttp.send();
};
问题是:我需要做什么来建立 token 并将其发送到 API?
最佳答案
如果您在 JavaScript 中全部在客户端执行此操作,您可能希望实现所谓的“隐式授权”流程。 Azure 在此处记录了该过程:https://azure.microsoft.com/en-us/documentation/articles/active-directory-v2-protocols-implicit/ .
基本上,您的页面要么有一个“登录”链接,要么会自动浏览到 Azure 授权页面,其中所有参数都编码到 URL 中,例如您的客户端 ID 和您向 Graph 请求的范围。如果需要,用户将必须登录,但在您的情况下,他们可能不必登录。一旦用户使用他们的凭据登录(再次,如果需要),他们将被要求同意允许您的应用程序访问他们的数据。假设他们说是,Azure 将使用查询哈希中的访问 token 重定向回您的页面。您需要有 JS 代码才能从哈希中提取访问 token 。例如,重定向看起来像:
https://localhost/myapp/#
access_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...
&token_type=Bearer
&expires_in=3599
&scope=https%3a%2f%2fgraph.microsoft.com%2fmail.read
&id_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...
&state=12345
伪步骤
Authorization http header 中传递 token 。您可以通过将以下行添加到代码中(在 send 之前)来完成此操作:xmlhttp.setRequestHeader("Authorization", "Bearer "+ token);但为什么我必须这样做?
答案是 OAuth 是作为应用程序运行,而不是作为用户运行。因此,应用程序以用户身份进行身份验证的旧模型不适用。用户必须向该应用授予访问其数据的权限。
所以实际上这里发生的事情并不是应用程序必须“再次以用户身份进行身份验证”,而是必须以自身身份进行身份验证!这就是您所做的(通过提供您的客户端 ID)。作为该过程的一部分,用户可能必须登录以确认其身份,然后表示同意。
隐式流程中根本不会使用您的客户端密码。从本质上讲,您的应用会通过使用客户端 ID 并出现在您作为应用注册的一部分注册的 URL 中来“证明”它本身。
关于javascript - 来自 javascript : how to properly authenticate 的 Office 365 图形 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37574320/
我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
我正在使用Mandrill的RubyAPIGem并使用以下简单的测试模板:testastic按照Heroku指南中的示例,我有以下Ruby代码:require'mandrill'm=Mandrill::API.newrendered=m.templates.render'test-template',[{:header=>'someheadertext',:main_section=>'Themaincontentblock',:footer=>'asdf'}]mail(:to=>"JaysonLane",:subject=>"TestEmail")do|format|format.h
我正在尝试使用Ruby2.0.0和Rails4.0.0提供的API从imgur中提取图像。我已尝试按照Ruby2.0.0文档中列出的各种方式构建http请求,但均无济于事。代码如下:require'net/http'require'net/https'defimgurheaders={"Authorization"=>"Client-ID"+my_client_id}path="/3/gallery/image/#{img_id}.json"uri=URI("https://api.imgur.com"+path)request,data=Net::HTTP::Get.new(path
Rails相对较新。我正在尝试调用一个API,它应该向我返回一个唯一的URL。我的应用程序中捆绑了HTTParty。我已经创建了一个UniqueNumberController,并且我已经阅读了几个HTTParty指南,直到我想要什么,但也许我只是有点迷路,真的不知道该怎么做。基本上,我需要做的就是调用API,获取它返回的URL,然后将该URL插入到用户的数据库中。谁能给我指出正确的方向或与我分享一些代码? 最佳答案 假设API为JSON格式并返回如下数据:{"url":"http://example.com/unique-url"
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我的公司有一个巨大的数据库,该数据库接收来自多个来源的(许多)事件,用于监控和报告目的。到目前为止,数据中的每个新仪表板或图形都是一个新的Rails应用程序,在巨大的数据库中有额外的表,并且可以完全访问数据库内容。最近,有一个想法让外部(不是我们公司,而是姊妹公司)客户访问我们的数据,并且决定我们应该公开一个只读的RESTfulAPI来查询我们的数据。我的观点是-我们是否也应该为我们的自己
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
我读了"BingSearchAPI-QuickStart"但我不知道如何在Ruby中发出这个http请求(Weary)如何在Ruby中翻译“Stream_context_create()”?这是什么意思?"BingSearchAPI-QuickStart"我想使用RubySDK,但我发现那些已被弃用前(Rbing)https://github.com/mikedemers/rbing您知道Bing搜索API的最新包装器(仅限Web的结果)吗? 最佳答案 好吧,经过一个小时的挫折,我想出了一个办法来做到这一点。这段代码很糟糕,因为它是
在几个项目中,我希望有一个类似rakeserver的rake任务,它将通过任何需要的方式开始为该应用程序提供服务。这是一个示例:task:serverdo%x{bundleexecrackup-p1234}end这行得通,但是当我准备停止它时,按Ctrl+c并没有正常关闭;它中断了Rake任务本身,它说rakeaborted!并给出堆栈跟踪。在某些情况下,我必须执行Ctrl+c两次。我可能可以用Signal.trap写一些东西来更优雅地中断它。有没有更简单的方法? 最佳答案 trap('SIGINT'){puts"Yourmessa