首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >API不会使用MSAL通过从SPA传递的令牌对AAD进行身份验证

API不会使用MSAL通过从SPA传递的令牌对AAD进行身份验证
EN

Stack Overflow用户
提问于 2017-07-24 17:14:29
回答 2查看 1.4K关注 0票数 2

我正在尝试调整引用为herehere的示例B2C代码,以针对我们的组织AAD工作。

我有一个SPA应用程序,它通过MSAL成功地与AAD进行身份验证,并接收令牌。SPA应用程序可以使用令牌从MS Graph API中提取数据--因此我确信令牌是有效的。

SPA当前正在本地运行@ localhost:9000。

我还有一个运行@ localhost:3000的Nodejs API应用程序。SPA应用程序调用应用程序接口,传递用于GraphAPI的相同令牌。API应用程序应该使用该令牌对用户进行身份验证,并提供对API的访问;然而,我只得到了一个401 - Unauthorized。

(我正在使用Aurelia作为我的客户端代码。使用Aurelia的HTTP客户端发出HTTP请求)。

以下是用于调用API的SPA代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//Not entirely sure what to use as the scope here!!  API is registered to allow user.read Graph API scope.
this.config.msClient.acquireTokenSilent(["user.read"]).then(token => {
   console.log("Token acquired silently.");
   this.makeAPICall(token);
}, error => { ... }
);

makeAPICall(token) {
   this.http.configure(config => {
     config
       .withBaseUrl('http://localhost:3000/')
       .withDefaults({
           headers: {
               'Authorization': 'Bearer ' + token
           }
      }

      this.http.fetch("user/0")
       .then(response => {
          debugger;  //response is 401 Unauthenticated at this point
       }, error => { ... });

}

我已经在apps.dev.microsoft.com为我的应用程序接口注册了一个应用程序。下面是我的服务器端(API) Nodejs代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const express = require("express")
const port = 3000
const passport = require("passport")
var BearerStrategy = require("passport-azure-ad").BearerStrategy;

var userList = [
    {id: 1, first: "Mickey", last: "Mouse", age: 95},
    {id: 2, first: "Donald", last: "Duck", age: 85},
    {id: 3, first: "Pluto", last: "leDog", age: 70}
]

var options = {
    identityMetadata: "https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration",
    clientID: "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx",  //My registered App Id
    passReqToCallback: false,
    validateIssuer: true,
    issuer: "xxxxxxx"  //Our tenant name
};

var strategy = new BearerStrategy(options, (token, done) => {
    console.log(token);
    done(null,{}, {scope: '*'});
})


const app = express()
app.use(passport.initialize())
passport.use(strategy);

//Allow CORS
app.use((req, res, next) => {
    res.header("Access-Control-Allow-Origin","*");
    res.header("Access-Control-Allow-Headers","Authorization, Origin, X-Requested-With, Content-Type,Accept");
    next();
})

app.get("/",(request, response) => {  //Unauthenticated -- always works
    response.send("Hello World!")
})

app.get("/user/:id",passport.authenticate('oauth-bearer',{session: false }),
  (request, response) => {
    //Never seem to get here (when debugging) as authenticate always fails
    let id = request.params["id"];
    let user = userList[id];
    if(user) response.json(user);
    else response.send("No user found")
})

app.listen(port, () => {
    console.log("Listening on port " + port)
})

我相信我只是误解了这一切是如何工作的,但我希望能得到一些指导,关于我需要做些什么来让它工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-24 17:46:43

令牌类似于银行支票:它们只能由为其编写的人进行缓存。为MS Graph颁发的令牌将以Microsoft Graph作为受众,并且仅应由Microsoft Graph接受。任何其他接收该令牌的API X都应该拒绝该令牌。打算调用X的客户端应该为X请求一个令牌,而不管它是否已经拥有另一个服务的令牌(如Microsoft图形)。这里有一个使用ADAL JS:https://azure.microsoft.com/en-us/resources/samples/active-directory-angularjs-singlepageapp-dotnet-webapi/实现的流程示例:在这一点上,Azure AD API(由MSAL使用)不能发布自定义v2的访问令牌:该功能正在开发中,但我们不知道何时它将在生产中可用。在此之前,v2不支持这种拓扑(因此使用MSAL )。抱歉的!

票数 2
EN

Stack Overflow用户

发布于 2018-07-13 13:02:28

一年后,现在可以使用MSAL保护您的自定义API。在应用程序门户(https://apps.dev.microsoft.com)中,您可以创建您的应用程序,然后“添加平台”两次-一次用于您的web应用程序SPA,另一次用于您的web api。在web api中,创建一个“作用域”,例如"api://e892d79e-03e7-4e5e-.../access_as_user",,然后将该作用域传递给acquireTokenSilent调用(而不是上面示例中的"user.read“)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45286400

复制
相关文章
在asp.net中为Web用户控件添加属性和事件
在90年代初,Microsoft为Web程序员提供的ActiveServerPages(ASP运维
Java架构师必看
2020/10/15
2.4K0
为博客添加访问来源提醒功能
在网页底部自定义中添加 如果你网站开启了pjax,可能还会有点小bug,问题不大 <!-- 客户端信息 --> <div id="fps" style="z-index:5;position:fixed;bottom:3px;left:3px;color:#2196F3;font-size:10px;"></div> <script type="text/javascript" src="https://cdn.jsdelivr.net/gh/kaliisra/myblogstatic/ke
纯情
2023/04/26
3000
为精灵添加触摸事件
  这可能是游戏中最普通的场景了:点击某个精灵,触发此精灵的一系列动作。比如:精灵是一块石头,触摸石头后,让石头从A点移动到B点。
古时的风筝
2022/05/11
5810
Android中在activity给别的页面的控件添加控件点击事件
最简单的办法就是在xml的控件里写android:onClick="method",然后在activity里面写对应的方法。
SakuraTears
2022/01/13
1.8K0
Android中为Fragment添加Menu的方法
右键res文件夹,选择New -> Android resource file
飞奔去旅行
2019/06/13
1.6K0
Android中为Fragment添加Menu的方法
IDEA在同一工作空间,显示多个项目
IDEA 的工作空间,默认一个项目,多模块。如何在同一个工作空间,同时显示多个项目呢?
JavaEdge
2023/03/02
3.6K0
IDEA在同一工作空间,显示多个项目
在页面离开前提醒你的beforeunload事件
有些需要填写用户信息的界面,当用户点击返回,或者刷新界面,关闭界面的时候,需要及时提醒用户当前的页面填写了内容,如果返回或者刷新的话,会导致内容丢失。然后让用户自行决定后续的操作。
Daotin
2020/10/27
7.9K0
在页面离开前提醒你的beforeunload事件
Android中为图标加上数字--用于未读短信数提醒,待更新应用数提醒等
在我们开发一些如短消息、应用商店等应用时,会考虑在短消息的图标上加上未读短信的数量,在应用商店上加上可以升级的应用数量,这样不占太大空间还能达到提示的目的。
飞雪无情
2018/08/28
1.7K0
Android中为图标加上数字--用于未读短信数提醒,待更新应用数提醒等
为treeview添加客户端事件
在使用TreeView控件时,要想取得选种的节点的信息需要返回服务器,这样的话就加重了服务器的负担。 如果仅仅是为了取的选种节点的信息,其实根本没有必要返回服务器,在客户端也可以的。 .CS文件: TreeNode nodeF = new TreeNode(); nodeF.ID = drKs[0].ToString()+"\" onclick=\"javascript:node_click('"+drKs[0].ToString()+"');"; //关键就在加红的这段代码。 nodeF.Te
用户1075292
2018/01/23
1.3K0
Redis案例 - 事件提醒
场景 任务是 当 redis set 中有新元素时及时处理 需要在set有新元素后自动得到通知,省得使用轮询的方式来查看是否有新元素 相当于对set做一个事件提醒 实现 如果能使用阻塞版命令就非常简单了,例如list的pop操作有阻塞版的brpop 阻塞版的意思就是:当key中为空时就等着,有新元素后就马上获取 非阻塞版命令则不等,直接返回了 获取set元素的命令spop是没有阻塞版本的,但可以把他俩一起使用,使用brpop来完成这个任务 新元素的事件处理,相当于消费者 示例代码 LO
dys
2018/04/03
1.2K0
Redis案例 - 事件提醒
Android 中为RecyclerView控件添加分隔线
在上一篇 RecyclerView 控件的文章中,我们看了一下ListView控件和RecyclerView控件的简单用法,那么下面我们将关注点放在RecyclerView上,毕竟RecyclerView控件在很多方面确实比ListView控件更好用。下面来看一下怎么对RecyclerView中的子项添加分隔线: 首先,我们要知道,要对RecyclerView控件中的子项添加分隔线,我们要利用RecyclerView.ItemDecoration类来实现。我们要继承RecyclerView.ItemDecoration类并且重写里面的方法来实现,一般来说,一个自定义的ItemDecoration类的基本写法:
指点
2019/01/18
2.1K0
Android 中为RecyclerView控件添加分隔线
在CentOS(Linux)中添加单个IP和批量添加多个IP地方法
在/etc/sysconfig/network- s/中新建文件ifcfg-eth0:*,*为数字序号,多个IP则依次增大 以0为例,建立文件ifcfg-eth0:0
雾海梦曦
2022/11/14
3.7K0
在CentOS(Linux)中添加单个IP和批量添加多个IP地方法
1、普通方法: 在/etc/sysconfig/network- s/中新建文件ifcfg-eth0-range0
Inkedus
2020/04/16
4.6K0
Android向系统日历添加日程事件
在项目开发过程中,有时会有预约提醒、定时提醒等需求,这时我们可以使用系统日历来辅助提醒。通过向系统日历中写入事件、设置提醒方式(闹钟),实现到达某个特定的时间自动提醒的功能。这样做的好处是由于提醒功能是交付给系统日历来做,不会出现应用被杀情况,能够做到准时提醒。 一般来说实现向系统日历中读写事件一般有以下几个步骤: (1)需要有读写日历权限; (2)如果没有日历账户需要先创建账户; (3)实现日历事件增删改查、提醒功能;
developerHaoz
2022/05/13
3.2K0
Typecho 网站添加复制提醒
本文最后更新于2021年7月21日,已超过1年没有更新,如果文章内容或图片资源失效,请留言反馈,我们会及时处理,谢谢!
回忆大大
2023/03/08
6520
Typecho 网站添加复制提醒
Typecho网站添加复制提醒
原本在使用handsome主题的时候就在使用复制提醒,感觉在网站上复制内容没有提醒总感觉心里没底,不知道内容是否复制下来了,总是win+v(win)、command+shift+v(mac)来查看,很麻烦。所以复制弹窗还是很有必要的。
ZGGSONG
2022/09/09
1.7K0
Typecho网站添加复制提醒
Typecho 网站添加复制提醒
首先引入JS,将下方代码复制添加至/body前面的代码里,一般在footer.php
回忆大大
2021/08/09
8370
Typecho 网站添加复制提醒
在 Android O 上用到 MediaStyle 的提醒功能
原文地址:Migrating MediaStyle notifications to support Android O 原文作者:Nazmul Idris (Naz) 译文出自:掘金翻译计划 本文永
Android 开发者
2018/05/31
2.4K0
点击加载更多

相似问题

在android日历中难以设置多个事件/提醒

12

Android -添加无提醒的日历事件

23

在日历应用程序中向事件添加事件和多个提醒

13

在android日历中添加用户无法修改的事件/提醒

11

在Android中添加提醒

11
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文