静默获取Microsoft Access Token

fgw7neuy  于 2022-09-21  发布在  其他
关注(0)|答案(3)|浏览(331)

我正在尝试连接到Graph API并获取用户访问令牌。

我的问题是,我不知道如何使用凭据静默连接到Graph API(没有浏览器)。

我目前使用MSLogin()获取访问令牌,但它会打开一个浏览器,您可以在浏览器中授权AzureAD应用程序访问您的帐户。Java中的一个库与我在c#https://github.com/Litarvan/OpenAuth中想要的差不多

我需要这样的东西:MSGraph.ConnectAsync(email, pass).getAccessToken();

下面是我的当前代码(通过浏览器)

private const string ClientId = "520f6e8e-xxxxxxxxxxxxxxxxxxxx";
private string[] scopes = { "https://graph.microsoft.com/user.read" };

private static AuthenticationResult authResult;
public static IPublicClientApplication PublicClientApp;

private async Task<AuthenticationResult> MSLogin()
{
    PublicClientApp = PublicClientApplicationBuilder.Create(ClientId).WithRedirectUri("msal520f6e8e-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx://auth").Build();
    authResult = await PublicClientApp.AcquireTokenInteractive(scopes).ExecuteAsync();
    return authResult;
}
zqdjd7g9

zqdjd7g91#

如果您使用的是Microsoft Graph .NET Client Library,您可以查看有关如何实现username/password authentication flow的示例文档。

string[] scopes = {"User.Read"};

var usernamePasswordCredential = new UsernamePasswordCredential("username@domain.com", "password", tenantId, clientId);

var graphClient = new GraphServiceClient(usernamePasswordCredential, scopes);

var me = await graphClient.Me.Request().GetAsync();
xfyts7mz

xfyts7mz2#

您可以使用AcquireTokenByUsernamePassword(),参见MSDN

但是请注意,微软不鼓励使用这种流,根据您的AzureAD设置,可能会有限制(即,您只能在特定的IP范围内获取令牌,等等)。

fjnneemd

fjnneemd3#

你可以静默获得访问令牌,但不是第一次,首先用户必须通过微软的登录流程授权你的应用程序,对于你随后对微软的调用,你可以在没有用户干预的情况下获得访问令牌。

我只会给出一个基本的想法,而不是集中在您可能正在使用的特定SDK上。对于哪种方法,您可以决定哪种方法适合您的需要。

1.我假设您已经随身携带了您的凭据和所需的作用域,否则您需要获得这些。
1.使用您获得的凭据制定正确的URL,并且需要在URL中添加一个额外的作用域,即offline_access。然后,您需要将用户重定向到Microsoft进行初始授权。
1.如果用户登录成功,微软会使用Authorization Code将用户重定向回您的网站。
1.获取授权码,并使用/oauth2/{version}/token API将其交换为Access Token
1.您将收到上述调用的响应,其中包含Access TokenRefresh Token。您需要将刷新令牌存储在某个位置以供将来使用。

现在是有趣的部分。

1.使用refresh token,您可以在访问令牌到期时续费,无需用户干预。您可以使用带参数的oauth2/v2.0/token API:

client_id={your_client_id}&scope={your_scopes}&refresh_token={refresh_token_obtained}&grant_type=refresh_token&client_secret={your_client_secret}

由此产生的响应如下所示:

{
    "access_token": "new access token",
    "token_type": "Bearer",
    "expires_in": 3599,
    "scope": "your scopes",
    "refresh_token": "refresh token",
}

参考:https://docs.microsoft.com/en-us/graph/auth-v2-user#authorization-request

相关问题