Microsoft ID プラットフォ`ムのアクセスト`クンが”Invalid Signature”になる周 その1Express + Passport
峻さん、こんにちは。室宝蝕kグル`プの稼-看噛温敬温稼です。
タツノオトシゴの嶼寂に、タツノイトコとタツノハトコがいます。
云籾です。
Microsoft ID プラットフォ`ムからk佩されたアクセスト`クンをGraph API參翌のリソ`スサ`バ`で旋喘しようとすると、”Invalid Signature”として屎しくI尖してくれません。でアクセスト`クンを盾裂しようとすると、揖に”Invalid Signature”が燕幣されてデジタル俸兆の編^に払,靴討い襪海箸蛍かります。書指は”Invalid Signature”の尖喇とI圭隈についてのおです。
朕肝
Invalid Signature
採絞、デジタル俸兆の編^に払移するのか
Microsoft ID プラットフォ`ムからk佩されたアクセスト`クンを聞って、Graph APIで秤鵑鯣ゝ辰垢襪海箸漏栖ます。しかし、Graph API參翌のリソ`スサ`バ`にしてアクセスト`クンを聞喘すると、デジタル俸兆の編^に払,靴討靴泙い泙后この並鵑砲弔い討Azure AD GitHubのにh苧がありました。
Yとしては、Graph API喘にk佩されたアクセスト`クンには、Microsoft鏡徭のデジタル俸兆が仏されているため、そのアクセスト`クンはGraph API參翌のリソ`スサ`バ`では聞えません。JWTのデジタル俸兆はJWS()でカ┐気譴討り、Graph API喘にk佩されたアクセスト`クンは、そのカ┐ら翌れたデジタル俸兆をしているため、畜にはJWTではないことになります。
それは或粥顎岳鞄2.0の号鯉として諒籾ないの
Graph API喘にk佩されたアクセスト`クンは、畜にはJWTではありません。これはOAuth2.0のク颪箸靴}ないのでしょうか心陲┐蓮}ありません々です。OAuth2.0はト`クンのk佩と聞喘にvするJ辛プロトコルです。ト`クンの碧にvしてはg廾卆贋になります。なので、アクセスト`クンがJWT參翌のeの採かでも、リソ`スサ`バ`箸任修離肌`クンの嗤塵圓編^竃栖れば、OAuth2.0のク馼蓮}ないことになります。
とはいえ、でアクセスト`クンの嶄附が需れてしまうなど、干安意であるかのように列盾させてしまったことは賦しUないと、で峰べられています。
Graph API參翌のアクセスト`クンをk佩する圭隈
ゴ`ル
Graph API參翌のリソ`スサ`バ`で旋喘辛嬬な、JWT侘塀のアクセスト`クンを函誼したい栽は、User.ReadなどのGraph APIにvするアクセス慙泙scopeに峺協しなければ措いとのことです。なんともエンジニア日かせな碧ですが、碧圭がありません。シ`ケンスを2指に蛍けて、アクセスト`クンを2つk佩してBうようにします。
1指朕のシ`ケンスはOIDCJ^を佩いつつ、Graph API喘のアクセスト`クンをk佩してBいます。これは念指と揖じ坪否です。2指朕のシ`ケンスでは、或粥顎岳鞄2.0により徭念で喘吭したリソ`スサ`バ`へのアクセスト`クンをk佩してBいます。1指朕のシ`ケンスは念指を歌孚してください。書指は2指朕のシ`ケンスについて峰べます。

リソ`スサ`バ`喘のアプリを鞠hする
からリソ`スサ`バ`喘のアプリを鞠hします。アプリを鞠hした朔、仝粥永鴛の巷蝕々により、スコ`プを弖紗します。

クライアント迦のアクセス俯辛にリソ`スサ`バ`を弖紗する
クライアント迦のアクセス俯辛に、枠ほど鞠hしたリソ`スサ`バ`を弖紗します。これで扮犬詫蠢砲任后

或鴛禽遺喘の兜豚譜協を佩う
或鴛禽遺範^に駅勣な譜協を永温壊壊沿看姻岳に局します。
// リソ`スサ`バ`へのアクセスト`クンを函誼するためのO協
const oauth2Strategy = new OAuth2Strategy(
{
passReqToCallback: true,
authorizationURL: `https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/authorize`,
tokenURL: `https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token`,
clientID: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
clientSecret: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
scope: ["offline_access", "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy/.default"],
callbackURL: "/cb2", // callbackURL
},
function (
req: Request,
accessToken: string,
refreshToken: string,
profile: any,
done: VerifyCallback
) {
// 編^
return done(null, {});
}
);
或鴛禽遺ではなく、或粥顎岳鞄2.0でト`クンをk佩してBいますので、聞喘するクラスはOAuth2Strategyになります。1指朕のシ`ケンスと曳べて、局す譜協坪否はほぼ揖じです。この嶄で廣朕すべきはscopeで、yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy/.defaultを峺協しています。yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyyはリソ`スサ`バ`のクライアント鴛禽です。yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy/.defaultを峺協することにより、ユ`ザ`にリソ`スサ`バ`への範辛を箔めると揖扮に、リソ`スサ`バ`へアクセス辛嬬なアクセスト`クンがk佩されます。
温顎岳鞄艶稼岳庄界温岳艶を柵び竃す
リクエストを鞭けて、永温壊壊沿看姻岳の温顎岳鞄艶稼岳庄界温岳艶()をI尖します。4つ協吶しています。
// authenticate (1指朕)
// ユ`ザ`のJ^と、Graph APIへのアクセスト`クンを函誼します。
server.get("/login", passport.authenticate("openidconnect"));
// authenticate (2指朕)
server.get(
"/cb",
passport.authenticate("openidconnect", {
failureRedirect: "/",
failureMessage: true,
}),
async function (req, res, err) {
// `/gettoken`へリダイレクトする
// ★哈きAき、リソ`スサ`バ`へのアクセスト`クンを函誼するシ`ケンスを佩います。
res.redirect("/gettoken");
}
);
// authenticate (3指朕)
// リソ`スサ`バ`へのアクセスト`クンを函誼します。
server.get("/gettoken", passport.authenticate("oauth2"));
// authenticate (4指朕)
server.get(
"/cb2",
passport.authenticate("oauth2", {
failureRedirect: "/",
failureMessage: true,
}),
// post-request
async function (req, res, err) {
// `/user`へリダイレクトする
res.redirect("/user");
}
);
authenticate (2指朕)では、/gettokenにリダイレクトして、そのままリソ`スサ`バ`喘のアクセスト`クンを函誼するようにしています。貧芝はh苧喘に噫柴なコ`ドを福いていますが、g縞は遺皆檎酷貨に壊岳温岳艶を局して編^するようにした圭が措いでしょう。
おわりに
或粥顎岳鞄2.0はト`クンのk佩と聞喘のプロセスであり、ト`クンの碧を根め、謹くがg廾卆贋もしくは桟廠卆贋となっています。揖じ或鴛禽遺範^プロトコルだとしても、範^児徒が離えば、聾かなところで碧が呟なることが措く蛍かる並箭ですね。念指と揖じ急めの冱匐になりますが、範^児徒のクセを屎しく尖盾しないといけませんね。
肝指はこの}をSpring Securityでどう盾Qするのかをテ`マにしたいと房います。
ではまた。
