Skip to content

Commit b535d03

Browse files
committed
aliyundrive open token
1 parent b725ee9 commit b535d03

File tree

6 files changed

+226
-10
lines changed

6 files changed

+226
-10
lines changed

docs/.vuepress/components/NaiveConfig.vue

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script lang="ts" setup>
2-
import { darkTheme, lightTheme, NConfigProvider, GlobalThemeOverrides } from 'naive-ui'
2+
import { darkTheme, lightTheme, NConfigProvider, GlobalThemeOverrides, NMessageProvider } from 'naive-ui'
33
import { ref } from "vue";
44
55
const theme = ref(lightTheme)
@@ -31,7 +31,9 @@ const themeOverrides: GlobalThemeOverrides = {
3131

3232
<template>
3333
<NConfigProvider :theme-overrides="themeOverrides" :theme="theme">
34-
<div style="height: 8px;"></div>
35-
<slot />
34+
<NMessageProvider>
35+
<div style="height: 8px;"></div>
36+
<slot />
37+
</NMessageProvider>
3638
</NConfigProvider>
3739
</template>
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
<script lang="ts" setup>
2+
import { NAlert, NSpace, NSpin, NInput } from 'naive-ui';
3+
import { ref } from 'vue';
4+
5+
const url = new URL(window.location.href);
6+
const code = url.searchParams.get("code");
7+
const error = url.searchParams.get("error");
8+
const error_description = url.searchParams.get("error_description");
9+
10+
interface Token {
11+
token_type: string;
12+
access_token: string;
13+
expires_in: number;
14+
refresh_token: string;
15+
error: string;
16+
}
17+
18+
const token = ref<Token>();
19+
20+
// const api = "http://localhost:3000"
21+
const api = "https://api.nn.ci"
22+
23+
const getToken = async () => {
24+
const resp = await fetch(api + `/alist/ali_open/token`, {
25+
method: "POST",
26+
headers: {
27+
"Content-Type": "application/json",
28+
},
29+
body: JSON.stringify({
30+
code: code,
31+
grant_type: "authorization_code"
32+
}),
33+
});
34+
const res: Token = await resp.json();
35+
token.value = res;
36+
};
37+
38+
if (code && !error) {
39+
getToken();
40+
}
41+
42+
</script>
43+
44+
<template>
45+
<NAlert :title="error || 'Error'" type="error" v-if="!code || error">
46+
{{ error_description }}
47+
</NAlert>
48+
<NSpace vertical size="large" v-else>
49+
<NAlert :title="token?.error" type="error" v-if="token?.error || token?.error">
50+
{{ token.error }}
51+
</NAlert>
52+
<NSpace vertical>
53+
<b>refresh_token:</b>
54+
<NSpin v-if="!token?.refresh_token" />
55+
<NInput v-else type="textarea" autosize readonly :value="token.refresh_token" />
56+
</NSpace>
57+
</NSpace>
58+
</template>
59+
60+
<style scoped>
61+
p {
62+
margin: 0;
63+
font-size: large;
64+
}
65+
</style>
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
<script lang="ts" setup>
2+
import { NButton, NSpace, NAlert, NImage, useMessage } from 'naive-ui';
3+
import { ref } from 'vue';
4+
5+
const alist_redirect_uri = "https://alist.nn.ci/tool/aliyundrive/callback"
6+
const app_id = "76917ccccd4441c39457a04f6084fb2f"
7+
8+
9+
10+
function goGet() {
11+
const url = new URL("https://open.aliyundrive.com/oauth/authorize");
12+
url.searchParams.set("client_id", app_id);
13+
url.searchParams.set("redirect_uri", alist_redirect_uri);
14+
url.searchParams.set(
15+
"scope",
16+
"user:base,file:all:read,file:all:write"
17+
);
18+
url.searchParams.set("response_type", "code");
19+
url.searchParams.set(
20+
"state", ""
21+
);
22+
window.open(url.toString(), "_blank");
23+
}
24+
25+
interface QrCodeResp {
26+
qrCodeUrl: string;
27+
sid: string;
28+
error: string
29+
}
30+
31+
const qrcode = ref<QrCodeResp>()
32+
33+
// const api = "http://localhost:3000"
34+
const api = "https://api.nn.ci"
35+
36+
const gettingQrCode = ref(false)
37+
38+
async function getQrCode() {
39+
try {
40+
gettingQrCode.value = true
41+
const resp = await fetch(api + "/alist/ali_open/qr", {
42+
method: "POST",
43+
headers: {
44+
"Content-Type": "application/json"
45+
},
46+
body: JSON.stringify({})
47+
})
48+
const res: QrCodeResp = await resp.json()
49+
qrcode.value = res
50+
} catch (e) {
51+
console.log(e)
52+
qrcode.value = {
53+
error: "error",
54+
qrCodeUrl: "",
55+
sid: ""
56+
}
57+
} finally {
58+
gettingQrCode.value = false
59+
}
60+
}
61+
62+
interface ScanStatus {
63+
status: string
64+
authCode: string
65+
}
66+
67+
const scanStatus = ref<ScanStatus>()
68+
const gettingScanStatus = ref(false)
69+
70+
const message = useMessage()
71+
72+
async function haveScan() {
73+
try {
74+
gettingScanStatus.value = true
75+
const resp = await fetch(`${api}/proxy/https://open.aliyundrive.com/oauth/qrcode/${qrcode.value?.sid}/status`)
76+
const res: ScanStatus = await resp.json()
77+
scanStatus.value = res
78+
if (res.status === "LoginSuccess") {
79+
const url = new URL(alist_redirect_uri);
80+
url.searchParams.set("code", res.authCode);
81+
window.open(url.toString(), "_blank");
82+
} else {
83+
message.warning(res.status)
84+
}
85+
} catch (e) {
86+
console.log(e)
87+
message.error(String(e))
88+
} finally {
89+
gettingScanStatus.value = false
90+
}
91+
}
92+
93+
</script>
94+
95+
<template>
96+
<NSpace vertical size="large">
97+
<NButton size="large" type="primary" @click="goGet" block>Go to login</NButton>
98+
<NButton size="large" type="info" @click="getQrCode" block :loading="gettingQrCode" :disabled="!!qrcode">Scan QrCode
99+
</NButton>
100+
<NAlert title="Error" type="error" v-if="qrcode?.error">
101+
{{ qrcode.error }}
102+
</NAlert>
103+
<NSpace v-if="qrcode?.qrCodeUrl" vertical>
104+
<NSpace justify="center">
105+
<NImage width="300" :src="qrcode.qrCodeUrl" />
106+
</NSpace>
107+
<NAlert title="Scan the QrCode" type="info">Use AliyunDrive APP To Scan Then Click the Button Below</NAlert>
108+
<NButton size="large" @click="haveScan" type="info" block :loading="gettingScanStatus">I have scan</NButton>
109+
</NSpace>
110+
<NAlert title="Warning" type="warning" v-if="scanStatus && scanStatus.status !== 'LoginSuccess'">
111+
{{ scanStatus.status }}
112+
</NAlert>
113+
</NSpace>
114+
</template>
115+
116+
<style scoped>
117+
h4 {
118+
margin: 0;
119+
}
120+
</style>

docs/.vuepress/config.ts

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,12 @@ export default defineUserConfig({
7373
indexName: "alist",
7474
}),
7575
],
76-
bundler:viteBundler({
76+
bundler: viteBundler({
7777
viteOptions: {
78-
ssr:{
79-
noExternal: ['naive-ui']
80-
}
81-
}
78+
ssr: {
79+
noExternal: ["naive-ui"],
80+
},
81+
},
8282
}),
8383
alias: {
8484
"@theme-hope/components/NormalPage": path.resolve(
@@ -117,9 +117,14 @@ export default defineUserConfig({
117117
__dirname,
118118
"./components/google/Callback.vue"
119119
),
120-
"@Google/Album": path.resolve(
120+
"@Google/Album": path.resolve(__dirname, "./components/google/Album.vue"),
121+
"@Aliyundrive/Request": path.resolve(
122+
__dirname,
123+
"./components/aliyundrive/Request.vue"
124+
),
125+
"@Aliyundrive/Callback": path.resolve(
121126
__dirname,
122-
"./components/google/Album.vue"
127+
"./components/aliyundrive/Callback.vue"
123128
),
124129
},
125130
});

docs/tool/aliyundrive/callback.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
---
2+
title: "Aliyundrive Refresh Token Callback"
3+
toc: false
4+
---
5+
6+
<NaiveClient>
7+
<Callback />
8+
</NaiveClient>
9+
10+
<script setup lang="ts">
11+
import Callback from "@Aliyundrive/Callback";
12+
</script>

docs/tool/aliyundrive/request.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
---
2+
title: "Get Aliyundrive Refresh Token"
3+
toc: false
4+
---
5+
6+
<NaiveClient>
7+
<Request />
8+
</NaiveClient>
9+
10+
<script setup lang="ts">
11+
import Request from "@Aliyundrive/Request";
12+
</script>

0 commit comments

Comments
 (0)