gpt4 book ai didi

azure - 如何验证 Microsoft Graph API jwt access_token 并保护您的 API?

转载 作者:行者123 更新时间:2023-12-02 23:10:14 25 4
gpt4 key购买 nike

场景:

我有一个 angular5 客户端应用程序,它使用 hello.js 使用 Office 365 凭据对用户进行身份验证。

客户端代码:

  hello.init({
msft: {
id: configuration.AppID,
oauth: {
version: 2,
auth: 'https://login.microsoftonline.com/' + configuration.TenantID + '/oauth2/v2.0/authorize'
},
scope_delim: ' ',
form: false
},
},
{ redirect_uri: configuration.redirecturl }
);
}


login() {

hello('msft').login({ scope: 'User.Read People.Read', display: 'popup' })
.then((authData: any) => { // console.log(authData);

this.zone.run(() => {

// get profile
}

成功的响应是(出于安全原因而被操纵)

{  
"msft":{
"access_token":"REMOVED TOKEN HERE",
"token_type":"Bearer",
"expires_in":3599,
"scope":"basic,User.Read,People.Read",
"state":"",
"session_state":"3b82898a-2b3f-445363f-89ae-d9696gg64ad3",
"client_id":"672330148-2bb43-3080-9eee-1f46311f789c",
"network":"msft",
"display":"popup",
"redirect_uri":"http://localhost:5653/",
"expires":15245366.218
}
}

解码后的access_token有以下几个键:

标题:

<强>1。 nonce(需要一些特殊处理,我找不到任何有关特殊处理的文档)

<强>2。类型:JWT

有效负载:

“aud”:“https://graph.microsoft.com”,

收到 access_token 后,我将在每次调用后端 API 的授权 header 中发送 access_token。目标是验证 token ,并且仅在 access_token 经过验证和授权后才发送成功的响应。如果不成功,则返回 401 Unauthorized。

用于验证 access_token 的 API 代码,ASP .NET CORE 2,以下 ( https://auth0.com/blog/securing-asp-dot-net-core-2-applications-with-jwts/ )

namespace JWT
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}

public IConfiguration Configuration { get; }

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = Configuration["Jwt:Issuer"],
ValidAudience = Configuration["Jwt:Issuer"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]))
};
});

services.AddMvc();
}
}
}

// other methods
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}

app.UseAuthentication();

app.UseMvc();
}

在 appsettings.json 中我有:

{   "Jwt": {
"Key": "verySecretKey", **(I got the key from https://login.microsoftonline.com/common/discovery/keys with the kid value in access_token header)**
"Issuer": "https://sts.windows.net/49bcf059-afa8-4bf9-8470-fad0c9cce27d/", } }

最后,我收到的错误是:“WWW-Authenticate →承载错误=“invalid_token”,error_description=“未找到签名 key ””

过去几天以来我一直被困在这里,任何帮助都将是我的救星。

要点:

  1. 我尝试验证 jwt.io 中的 access_token ( https://nicksnettravels.builttoroam.com/post/2017/01/24/Verifying-Azure-Active-Directory-JWT-Tokens.aspx ),但无法验证。

  2. 这里的aud是https://graph.microsoft.com ,我不确定是否需要以及为什么需要将 aud 更改为我的客户端 ID。我该怎么做?

  3. 代码中是否有问题,或者我是否需要调整请求 header token 的方式。

如果您需要更多信息,请告诉我。

最佳答案

I tried to validate the access_token in jwt.io (https://nicksnettravels.builttoroam.com/post/2017/01/24/Verifying-Azure-Active-Directory-JWT-Tokens.aspx) but I was not able to.

据我所知,Microsoft Graph API 访问 token 的签名方式与其他访问 token 不同。您不需要验证用于其他 API 的 token ,这是他们的工作。

The aud here is https://graph.microsoft.com, I am not sure if I need to and why do I need to change aud to my client id. how do I do that?

我不了解 HelloJS,但在使用 response_type=id_token token 进行身份验证后,您应该能够获取 Id token 。然后您需要将其附加到请求中。它应该将您的客户端 ID 作为受众。

Is there something wrong in the code or do i need to tweak the way I am requesting header tokens.

唯一让我印象深刻的是你做了很多不必要的配置。基本上配置应该是:

.AddJwtBearer(o =>
{
o.Audience = "your-client-id";
o.Authority = "https://login.microsoftonline.com/your-tenant-id/v2.0";
})

处理程序将在启动时自动获取公共(public)签名 key 。在应用程序中对签名 key 进行硬编码并不是一个好主意,因为当 AAD 完成签名 key 翻转时,您的应用程序将会崩溃。

关于azure - 如何验证 Microsoft Graph API jwt access_token 并保护您的 API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49933215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com