Azure 使用Sharepoint客户端Web部件登录

Azure 使用Sharepoint客户端Web部件登录,azure,jenkins,sharepoint,azure-active-directory,spfx,Azure,Jenkins,Sharepoint,Azure Active Directory,Spfx,我面临使用Sharepoint客户端Web部件登录Jenkins的问题 Jenkins端的安全性:使用Azure AD插件,用户现在可以使用Office 365凭据登录 在云上:创建了一个应用注册,重定向URI为-https://{JenkinsDomain}/securityRealm/finishLogin 现在我正在创建一个客户端Web部件,并尝试访问URL-https:///api/json?tree=jobs[名称,颜色]在web部件中显示“错误403-禁止”,尽管当我从新选项卡尝试相

我面临使用Sharepoint客户端Web部件登录Jenkins的问题

Jenkins端的安全性:使用Azure AD插件,用户现在可以使用Office 365凭据登录

在云上:创建了一个应用注册,重定向URI为-https://{JenkinsDomain}/securityRealm/finishLogin

现在我正在创建一个客户端Web部件,并尝试访问URL-https:///api/json?tree=jobs[名称,颜色]在web部件中显示“错误403-禁止”,尽管当我从新选项卡尝试相同的URL时,它会给出响应

我尝试过的事情:

const msalConfig = {
  auth: {
    clientId: "api://<client>/",
    // authority: "https://login.microsoftonline.com/common",
    authority : "https://login.microsoftonline.com/<tenantID>/",
    scopes: ['https://graph.windows.net/Directory.Read.All'],
    redirectUri : 'https://<tenantName>.sharepoint.com/'
  }
};
var userAgentApplication = new Msal.UserAgentApplication(msalConfig)

userAgentApplication.loginPopup().then(function (id_token) {
  console.log(id_token);
  var user = userAgentApplication.getAccount();
  console.log(user);
  if (user) {

  }
})
const msalConfig={
认证:{
客户ID:“api:///”,
//权限:“https://login.microsoftonline.com/common",
权限:“https://login.microsoftonline.com//",
范围:['https://graph.windows.net/Directory.Read.All'],
重定向URI:'https://.sharepoint.com/'
}
};
var userAgentApplication=新的Msal.userAgentApplication(msalConfig)
userAgentApplication.loginPopup().then(函数(id_令牌){
console.log(id\u令牌);
var user=userAgentApplication.getAccount();
console.log(用户);
如果(用户){
}
})
这段代码给了我一个错误:

AADSTS50011:请求中指定的答复URL与 为应用程序配置的回复URL: 'api://{clientID}/'

是否有任何方法可以通过客户端Web部件访问启用Azure AD的Jenkins API?
感谢您的帮助。下面给出了从代码中调用Jenkins REST API的步骤,可以是Javascript/Java

  • 使用SSO或Jenkins登录登录Jenkins服务器(在您的情况下,您的广告将对您进行身份验证并将您带到主页)
  • 登录后,转到管理用户
  • 在管理用户中,对于所选用户或超级管理员用户,我们必须选择进入用户详细信息页面的设置。我们通常有一个管理员用户,为其配置令牌
  • 在该页面中,我们必须为令牌提供一个名称并生成一个新令牌
  • 此令牌将被复制并放置在安全位置
  • 完成后,保存配置文件
  • 现在,从javascript/java代码中,使用usename:token格式并获取该值的base64字符串。下面给出了示例java代码片段

    字符串secureToken=Base64.getEncoder().encodeToString((用户+“:”+key.getBytes())

  • 在此之后,在
    Authorization
    标题中设置
    secureToken
    ,如下所示

    setHeader(HttpHeaders.AUTHORIZATION,“Basic”+secureToken)

  • 现在,您可以使用这种方法调用Jenkins REST API,如获取构建统计信息、触发构建等

  • 我将从Jenkins和post收集一些有用的链接以供进一步阅读,因为安全令牌将被安全地使用,并且出于安全原因,它们必须在一段时间后轮换(因为这些将使这篇文章非常长,所以我跳过这里的这些点)

    我有下面的链接,这将提供更多的细节

    另外,我得到了这段代码,我们很久以前就用它与node.js对话,希望这对您有用

    const options = {
        hostname: process.env.JENKINS_HOST,
        port: process.env.JENKINS_PORT,
        path: `${jenkinsBuildUrl}?param1=${param1}&param2=${params.Key}&operation=${operation}`,
        method: "POST",
        headers: {
            'Authorization': 'Basic '+ Buffer.from('admin'+':'+process.env.AUTH_TOKEN).toString('base64')
        }
    };
    
    const jr = https.request(options, jres => {
        jres.on("data", chunk => {
            console.log(`BODY: ${chunk}`);
        });
        jres.on("end", () => {
            console.log("Request completed with no data.");
        });
    });
    jr.on("error", e => {
        console.log(
            `Something went wrong when triggering the build in Jenkins Server in the current request: ${e.message}`
        );
    });
    jr.end();
    

    HTH

    您是否尝试在azure portal中的应用程序上提供匹配的重定向URI?您的广告的重定向URL是
    https://{JenkinsDomain}/securityRealm/finishLogin
    ,但在您使用的代码中是
    https://.sharepoint.com/
    这就是您获得STS的原因error@Saravanan我厌倦了“https://{JenkinsDomain}”/securityRealm/finishLogin的url也是,但它显示了相同的错误。另外,如果可以的话,我想从javascript获得类似的东西,谢谢@MdFaridUddinKiron是的,尝试过,但没有成功。您是否试图从Javascript访问Jenkins REST API?您好Saravanan,很抱歉响应延迟,非常感谢您为回答问题付出了这么多努力。这个答案很有帮助,但问题是Jenkins上有多个用户,而我作为管理员无法生成所有用户的令牌(Jenkins限制),我们需要每个用户使用我们的自定义应用程序,而不是Jenkins。(我知道这很奇怪,但这是要求)。无论如何,非常感谢你的帮助。如果我也找到了,我会发布解决方案。@AbhishekPal,不需要所有用户都生成令牌,一个令牌就可以满足所有用户的需要。即使您要为每个用户自动生成一个令牌,您也可以通过Jenkins REST API来完成。是的,这会有所帮助,我不知道我可以使用REST API创建另一个用户的令牌。非常感谢您的帮助,我们将尝试此操作并在此处更新。@Sarvanan,再次检查,管理员无法为其他用户创建用户令牌。另外,正如你所说的“一个令牌就可以满足所有用户的需要”,我也试过了,但没有,詹金斯夫妇抛出了一个错误-登录无效。@AbhishekPal,我们所有的应用程序都在使用管理员用户生成的安全令牌进行生产。您必须获取令牌并以如下格式使用:
    base64(((“admin:tokenvalue”).getbytes())
    。我假设您可以使用用户的用户名而不是“admin”,如果这样,它将失败。尝试使用固定用户名(例如:admin)而不是用户的用户名。