Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mk:apiの第三引数にnullを使いたい(トークン無しでエンドポイントを叩けるようにしてほしい) #11495

Closed
Sayamame-beans opened this issue Aug 9, 2023 · 4 comments
Labels
✨Feature This adds/improves/enhances a feature

Comments

@Sayamame-beans
Copy link
Member

Sayamame-beans commented Aug 9, 2023

Summary

Mk:api()では第一引数にURLそのものを渡すことが出来るため、リモートのエンドポイントも叩くことが出来ますが、トークン情報はローカル用のものが付与されてしまうため、手動で上書きする必要があります。
第二引数内に入力したiプロパティは無視されるため、第三引数にトークンを入れて上書きすることになりますが、ここで""を渡すと空文字のトークンとして認識されて認証エラーに、nullを渡すと以下の部分により型エラーとなります。

'Mk:api': values.FN_NATIVE(async ([ep, param, token]) => {
if (token) {
utils.assertString(token);
// バグがあればundefinedもあり得るため念のため
if (typeof token.value !== 'string') throw new Error('invalid token');
}

第三引数にnullを渡すことが出来れば、credentialが不要なエンドポイントをトークン無しでそのまま叩けるようになるはずです。

参考

第一引数でURLそのものを渡すことが出来る理由と思しき場所

window.fetch(endpoint.indexOf('://') > -1 ? endpoint : `${apiUrl}/${endpoint}`, {

nullを渡せばトークン無しで叩けると考える理由
// Append a credential
if ($i) (data as any).i = $i.token;
if (token !== undefined) (data as any).i = token;

追記:
ログアウト状態でMk:api()を使った場合はtokenがnullになるようになっていました。

const res = await os.api(ep.value, utils.valToJs(param), token ? token.value : (opts.token ?? null));

そのため、型チェックのところだけ修正出来れば対応出来そうですね…

@Sayamame-beans Sayamame-beans added the ✨Feature This adds/improves/enhances a feature label Aug 9, 2023
@syuilo
Copy link
Member

syuilo commented Sep 23, 2023

Mk:api()では第一引数にURLそのものを渡すことが出来るため、リモートのエンドポイントも叩くことが出来ますが、

Mk:apiはそのサーバーのAPIを叩くことを想定しているので、リモートのエンドポイントを叩けてしまうことがバグかも

リモートサーバーのAPIを叩きたいユースケースがあるのであればそれ用の関数を新たに用意した方が良さそう

@Sayamame-beans
Copy link
Member Author

Sayamame-beans commented Sep 23, 2023

リモートサーバーのAPIを叩きたいユースケース

Mk:api()でリモートのAPIが叩ける挙動は、こちらのプラグインの作成に協力した際に発見しました。

当該ノートをリモートサーバーで開くメニューを追加するプラグインです
https://misskey.io/notes/9i6v7qwpf5

ローカルで完結するプラグインならローカルのAPIが叩ければ問題無いですが、リモートの情報や自アカウントを絡めた動作を行いたい場合は必要になってくると思います。(例えば、投稿したノートを別のサーバーの自アカウントにRenoteさせるためのプラグインなど。この例はRenoteのためにトークンが必要ですが…)

(※この挙動を見つけるまでは、ローカルで完結しない動作を行う場合はブラウザ拡張を作成するしかないと思っており、それは面倒だな…となっていました)

@FineArchs
Copy link
Contributor

将来的にPlayに権限を設定できるようになったら「外部との通信」の項目を入れてもいいかもしれませんね

@Sayamame-beans
Copy link
Member Author

#11883 により目的が達成されなくなったのでCloseします。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
✨Feature This adds/improves/enhances a feature
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants