gpt4 book ai didi

postgresql - 如何使用用户名和密码从 Azure AD 检索到的 token 对 Azure PostgreSQL 进行身份验证?

转载 作者:行者123 更新时间:2023-12-03 03:54:50 26 4
gpt4 key购买 nike

我使用了https://learn.microsoft.com/en-us/azure/postgresql/howto-configure-sign-in-aad-authentication处的文档使 Azure AD 中的用户能够使用 token 向 Azure PostgreSQL 实例进行身份验证。我希望 Java 桌面应用程序的用户能够使用他们的用户名和密码进行身份验证并自动获取 token 。为此,我在我的租户中创建了一个公共(public)应用程序。我使用用户名和密码进行身份验证以获取访问 token 没有遇到任何问题,但该 token 显然不适合针对 https://ossrdbms-aad.database.windows.net 进行身份验证.

我收到错误“致命:访问 token 没有有效签名或已过期。请获取新 token 并重试。”

这是我正在使用的代码:

import com.microsoft.aad.msal4j.IAuthenticationResult;
import com.microsoft.aad.msal4j.PublicClientApplication;
import com.microsoft.aad.msal4j.UserNamePasswordParameters;

import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;
import java.util.Set;

public class AuthTest {

private final static String APP_ID = "096f6bc7-cf30-4b06-9f0e-093aaf3f9a4c";
private final static String AUTHORITY = "https://login.microsoftonline.com/organizations";

private static Connection getConnection(final String serverName, final String userName, final String password)
throws Exception {
final String url = String.format("jdbc:postgresql://%s.postgres.database.azure.com/postgres", serverName);
final Properties props = new Properties();
props.setProperty("user", userName + "@" + serverName);
props.setProperty("password", password);
props.setProperty("sslmode", "require");
return DriverManager.getConnection(url, props);
}

public static void main(final String[] args) throws Exception {
final String serverName = args[0];
final String userName = args[1];
final String password = args[2];
final PublicClientApplication pca = PublicClientApplication.builder(APP_ID).authority(AUTHORITY).build();
final Set<String> scopes = Set.of(
"User.Read"
);
final UserNamePasswordParameters parameters =
UserNamePasswordParameters.builder(scopes, userName, password.toCharArray()).build();
final IAuthenticationResult result = pca.acquireToken(parameters).get();
final String token = result.accessToken();

final Connection connection = getConnection(serverName, userName, token);
System.out.println("connection=" + connection);
}

}

我认为问题是我需要指定 https://ossrdbms-aad.database.windows.net/default (或 https://ossrdbms-aad.database.windows.net//.default )作为资源或范围。当我用此替换 User.Read 时,出现错误“AADSTS65001:用户或管理员尚未同意使用 ID 为“096f6bc7-cf30-4b06-9f0e-093aaf3f9a4c”且名为“AuthTest”的应用程序。发送交互式授权请求对于此用户和资源。”,这是可以理解的,因为我没有像 User.Read 那样通过门户授予同意。但我不知道如何授予此同意。

最佳答案

感谢 Jim Xu,我现在可以正常工作了。我必须添加“Azure OSSRDBMS 数据库”权限,如 /image/o4QO4.png 所示。 ,以管理员身份授予同意,然后将我的应用程序中的范围设置为 https://ossrdbms-aad.database.windows.net/user_impersonation .

关于postgresql - 如何使用用户名和密码从 Azure AD 检索到的 token 对 Azure PostgreSQL 进行身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64927456/

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