Jor*_*ton 5 azure node.js azure-active-directory
我正在用nodejs编码,我指的是这个文档:
正如该文档所说,我可以通过 JWT 令牌获取访问令牌。该文档说明了如何签署 JWT :
但我找不到任何关于它的演示代码。那么我如何实现它来获取访问令牌以通过nodejs调用microsoft graph apis?
感谢任何帮助,谢谢!
要完成整个过程,我们应该首先创建证书。我在这里使用自签名证书进行演示。
步骤1:创建.cer和.key文件,我们将.cer上传到Azure AD应用程序并使用.key文件来签署我们的JWT令牌。
1)通过Powershell创建一个自签名证书,密码为123456:
$cert = New-SelfSignedCertificate -certstorelocation cert:\localmachine\my -dnsname stantest.com
$pwd = ConvertTo-SecureString -String '123456' -Force -AsPlainText
$path = 'cert:\localMachine\my\' + $cert.thumbprint
Export-PfxCertificate -cert $path -FilePath <path of your pfx file> -Password $pwd
Run Code Online (Sandbox Code Playgroud)
2)在CMD中根据.pfx文件创建.cer文件:
openssl pkcs12 -in <path of .pfx file> -clcerts -nokeys -out <path of .cer>
Run Code Online (Sandbox Code Playgroud)
3)在CMD中根据.pfx文件创建.key文件:
openssl pkcs12 -in <path of .pfx file> -nocerts -nodes -out <path of .pem file>
openssl rsa -in <path of .pem file> -out <path of .key file>
Run Code Online (Sandbox Code Playgroud)
步骤 2:将 .cer 文件上传到 Azure AD 应用程序并记下其指纹值:
步骤 3:使用下面的 nodejs 代码签署 JWT 并交换 Microsoft Graph API 的访问令牌:
var jwt = require("jsonwebtoken");
var fs = require("fs");
var uuidv1 = require('uuid/v1');
var fetch = require("node-fetch");
var tenant = "<your tenant ID/Name>";
var clientID = "<your Azure AD app ID>";
var certThumbprint = "<.cer Thumbprint value on Azure portal>";
var privateKey = fs.readFileSync("<path of your .key file>").toString();
var certOctets = certThumbprint.match(/.{1,2}/g)
var certBuffer = Buffer.alloc(certOctets.length)
for(var i=0; i<certOctets.length; i++){
certBuffer.writeUInt8(parseInt(certOctets[i], 16), i);
}
//Perform base64url-encoding as per RFC7515 Appendix C
var x5t = certBuffer.toString('base64').replace(/=/g, '').replace(/\+/g, '-').replace(/\//g, '_');
var current = Date.now().toString().substr(0,10);
var payload=
{
"aud":"https://login.microsoftonline.com/"+tenant+"/oauth2/token",
"exp": Number(current) + 3600,
"iss":clientID,
"jti":uuidv1(),
"nbf":Number(current),
"sub":clientID
}
var token = jwt.sign(payload,privateKey,{algorithm: 'RS256',header: {"x5t": x5t}})
var reqTokenBody =
"grant_type=client_credentials&"+
"client_id="+clientID + "&" +
"resource=https://graph.microsoft.com&"+
"client_assertion="+ token +"&" +
"client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer"
fetch("https://login.microsoftonline.com/hanxia.onmicrosoft.com/oauth2/token",
{
method: 'POST',
headers:
{
'Content-Type': 'application/x-www-form-urlencoded',
},
body:reqTokenBody,
}).then((response) => response.json()).then((data) =>
{
console.log(JSON.stringify(data, null, 2));
}).catch((error) =>
{
console.log(error);
});
Run Code Online (Sandbox Code Playgroud)
结果 :
希望能帮助到你。
归档时间: |
|
查看次数: |
2213 次 |
最近记录: |