diff options
| author | Kagami Sascha Rosylight <saschanaz@outlook.com> | 2023-07-27 11:51:58 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-07-27 18:51:58 +0900 |
| commit | eb7b5f905ae811ed2efb03597638a7ea5d6e8dac (patch) | |
| tree | c753001ca784e0e490648a0f475f328a7b2c2d13 /packages/frontend/src | |
| parent | chore: 著作権とライセンスについての情報を各ファイルに... (diff) | |
| download | sharkey-eb7b5f905ae811ed2efb03597638a7ea5d6e8dac.tar.gz sharkey-eb7b5f905ae811ed2efb03597638a7ea5d6e8dac.tar.bz2 sharkey-eb7b5f905ae811ed2efb03597638a7ea5d6e8dac.zip | |
feat(backend): support OAuth 2.0 authorization (#11053)
* feat(backend): support OAuth 2.0 authorization
* secureRndstr fix
* nanndekowareta
* nanndekowareta2
* nanndekowareta3
* unref?
* refactor to not close fastify
* use microformats-parser
* Update OAuth2ProviderService.ts
* clarify the reason behind dns lookup
* refactor(backend): use @types/oauth2orize-pkce (#11350)
* refactor(backend): use @types/oauth2orize-pkce
* Update package.json
* Update pnpm-lock.yaml
---------
Co-authored-by: Kagami Sascha Rosylight <saschanaz@outlook.com>
---------
Co-authored-by: mtgto <hogerappa@gmail.com>
Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
Diffstat (limited to 'packages/frontend/src')
| -rw-r--r-- | packages/frontend/src/components/MkButton.vue | 4 | ||||
| -rw-r--r-- | packages/frontend/src/pages/oauth.vue | 67 | ||||
| -rw-r--r-- | packages/frontend/src/router.ts | 3 |
3 files changed, 74 insertions, 0 deletions
diff --git a/packages/frontend/src/components/MkButton.vue b/packages/frontend/src/components/MkButton.vue index 80d3292cbc..bcd58ae516 100644 --- a/packages/frontend/src/components/MkButton.vue +++ b/packages/frontend/src/components/MkButton.vue @@ -9,6 +9,8 @@ SPDX-License-Identifier: AGPL-3.0-only ref="el" class="_button" :class="[$style.root, { [$style.inline]: inline, [$style.primary]: primary, [$style.gradate]: gradate, [$style.danger]: danger, [$style.rounded]: rounded, [$style.full]: full, [$style.small]: small, [$style.large]: large, [$style.transparent]: transparent, [$style.asLike]: asLike }]" :type="type" + :name="name" + :value="value" @click="emit('click', $event)" @mousedown="onMousedown" > @@ -49,6 +51,8 @@ const props = defineProps<{ large?: boolean; transparent?: boolean; asLike?: boolean; + name?: string; + value?: string; }>(); const emit = defineEmits<{ diff --git a/packages/frontend/src/pages/oauth.vue b/packages/frontend/src/pages/oauth.vue new file mode 100644 index 0000000000..6a72057f46 --- /dev/null +++ b/packages/frontend/src/pages/oauth.vue @@ -0,0 +1,67 @@ +<template> +<MkStickyContainer> + <template #header><MkPageHeader/></template> + <MkSpacer :contentMax="800"> + <div v-if="$i"> + <div v-if="permissions.length > 0"> + <p v-if="name">{{ i18n.t('_auth.permission', { name }) }}</p> + <p v-else>{{ i18n.ts._auth.permissionAsk }}</p> + <ul> + <li v-for="p in permissions" :key="p">{{ i18n.t(`_permissions.${p}`) }}</li> + </ul> + </div> + <div v-if="name">{{ i18n.t('_auth.shareAccess', { name }) }}</div> + <div v-else>{{ i18n.ts._auth.shareAccessAsk }}</div> + <form :class="$style.buttons" action="/oauth/decision" accept-charset="utf-8" method="post"> + <input name="login_token" type="hidden" :value="$i.token"/> + <input name="transaction_id" type="hidden" :value="transactionIdMeta?.content"/> + <MkButton inline name="cancel" value="cancel">{{ i18n.ts.cancel }}</MkButton> + <MkButton inline primary>{{ i18n.ts.accept }}</MkButton> + </form> + </div> + <div v-else> + <p :class="$style.loginMessage">{{ i18n.ts._auth.pleaseLogin }}</p> + <MkSignin @login="onLogin"/> + </div> + </MkSpacer> +</MkStickyContainer> +</template> + +<script lang="ts" setup> +import MkSignin from '@/components/MkSignin.vue'; +import MkButton from '@/components/MkButton.vue'; +import { $i, login } from '@/account'; +import { i18n } from '@/i18n'; +import { definePageMetadata } from '@/scripts/page-metadata'; + +const transactionIdMeta = document.querySelector<HTMLMetaElement>('meta[name="misskey:oauth:transaction-id"]'); +if (transactionIdMeta) { + transactionIdMeta.remove(); +} + +const name = document.querySelector<HTMLMetaElement>('meta[name="misskey:oauth:client-name"]')?.content; +const permissions = document.querySelector<HTMLMetaElement>('meta[name="misskey:oauth:scope"]')?.content.split(' ') ?? []; + +function onLogin(res): void { + login(res.i); +} + +definePageMetadata({ + title: 'OAuth', + icon: 'ti ti-apps', +}); +</script> + +<style lang="scss" module> +.buttons { + margin-top: 16px; + display: flex; + gap: 8px; + flex-wrap: wrap; +} + +.loginMessage { + text-align: center; + margin: 8px 0 24px; +} +</style> diff --git a/packages/frontend/src/router.ts b/packages/frontend/src/router.ts index 52ca09be8b..0876e533d0 100644 --- a/packages/frontend/src/router.ts +++ b/packages/frontend/src/router.ts @@ -264,6 +264,9 @@ export const routes = [{ permission: 'permission', }, }, { + path: '/oauth/authorize', + component: page(() => import('./pages/oauth.vue')), +}, { path: '/tags/:tag', component: page(() => import('./pages/tag.vue')), }, { |