get tokens

shared-server
bat 3 years ago
parent 2ebe7a3c0d
commit 939fb83119

@ -4,6 +4,7 @@ export class Auth {
constructor({ constructor({
baseUrl, baseUrl,
remoteBaseUrl, remoteBaseUrl,
giteaAppBaseUrl,
giteaApiBaseUrl, giteaApiBaseUrl,
giteaWebBaseUrl, giteaWebBaseUrl,
giteaClientId, giteaClientId,
@ -11,6 +12,7 @@ export class Auth {
}) { }) {
this.baseUrl = baseUrl this.baseUrl = baseUrl
this.remoteBaseUrl = remoteBaseUrl this.remoteBaseUrl = remoteBaseUrl
this.giteaAppBaseUrl = giteaAppBaseUrl
this.giteaApiBaseUrl = giteaApiBaseUrl this.giteaApiBaseUrl = giteaApiBaseUrl
this.giteaWebBaseUrl = giteaWebBaseUrl this.giteaWebBaseUrl = giteaWebBaseUrl
this.giteaClientId = giteaClientId this.giteaClientId = giteaClientId
@ -24,10 +26,7 @@ export class Auth {
const search = new URLSearchParams() const search = new URLSearchParams()
search.set('response_type', 'code') search.set('response_type', 'code')
search.set('client_id', this.giteaClientId) search.set('client_id', this.giteaClientId)
search.set( search.set('redirect_uri', this.callbackUrl)
'redirect_uri',
this.remoteBaseUrl + '/api/auth/callback'
)
search.set('state', state) search.set('state', state)
url.search = search.toString() url.search = search.toString()
return url.toString() return url.toString()
@ -40,6 +39,10 @@ export class Auth {
return `${randomInt}-${timestamp}` return `${randomInt}-${timestamp}`
} }
get callbackUrl() {
return this.remoteBaseUrl + '/api/auth/callback'
}
async redirect(event) { async redirect(event) {
const state = this.buildState() const state = this.buildState()
const url = this.redirectUrl(state) const url = this.redirectUrl(state)
@ -56,9 +59,47 @@ export class Auth {
})) }))
} }
getToken(code) { get tokenEndpoint() {
this._code = code return (
return 'test' this.giteaAppBaseUrl +
'/login/oauth/access_token'
)
}
async getToken(code) {
const resp = await fetch(this.tokenEndpoint, {
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
grant_type: 'authorization_code',
code,
client_id: this.giteaClientId,
client_secret: this.giteaClientSecret,
redirect_uri: this.callbackUrl,
}),
})
return await resp.json()
}
saveTokens(headers, data) {
cookie.setCookie(headers, {
name: 'oauth.gitea.accessToken',
value: data.access_token,
})
cookie.setCookie(headers, {
name: 'oauth.gitea.refreshToken',
value: data.refresh_token,
})
cookie.setCookie(headers, {
name: 'oauth.gitea.expires',
value: String(
Math.floor(new Date().valueOf() / 1000) +
data.expires_in
),
})
} }
async callback(event) { async callback(event) {
@ -78,18 +119,42 @@ export class Auth {
})) }))
return return
} }
const token = await this.getToken(code) const data = await this.getToken(code)
cookie.deleteCookie(headers, 'oauth.gitea.state') cookie.deleteCookie(headers, 'oauth.gitea.state')
cookie.setCookie(headers, { this.saveTokens(headers, data)
name: 'oauth.gitea.token',
value: token,
})
event.respondWith(new Response('', { event.respondWith(new Response('', {
headers, headers,
status: 302, status: 302,
})) }))
} }
async refreshToken(refresh_token) {
const resp = await fetch(this.tokenEndpoint, {
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
refresh_token,
grant_type: 'refresh_token',
})
})
return await resp.json()
}
async refresh(event) {
const headers = new Headers()
const cookies = cookie.getCookies(
event.request.headers
)
const data = await this.refreshToken(body)
this.saveTokens(headers, data)
event.respondWith(
new Response(JSON.stringify({}), {headers})
)
}
async serve(event) { async serve(event) {
const {pathname} = new URL(event.request.url) const {pathname} = new URL(event.request.url)
const u = this.baseUrl const u = this.baseUrl
@ -97,6 +162,8 @@ export class Auth {
await this.redirect(event) await this.redirect(event)
} else if (pathname === `${u}/api/auth/callback`) { } else if (pathname === `${u}/api/auth/callback`) {
await this.callback(event) await this.callback(event)
} else if (pathname === `${u}/api/auth/refresh`) {
await this.refresh(event)
} else { } else {
event.respondWith(new Response( event.respondWith(new Response(
'Not Found', {status: 404} 'Not Found', {status: 404}

@ -51,6 +51,7 @@ export class Server {
this.auth = new Auth({ this.auth = new Auth({
baseUrl: this.baseUrl, baseUrl: this.baseUrl,
remoteBaseUrl: this.remoteBaseUrl, remoteBaseUrl: this.remoteBaseUrl,
giteaAppBaseUrl: this.giteaAppBaseUrl,
giteaApiBaseUrl: this.giteaApiBaseUrl, giteaApiBaseUrl: this.giteaApiBaseUrl,
giteaWebBaseUrl: this.giteaWebBaseUrl, giteaWebBaseUrl: this.giteaWebBaseUrl,
giteaClientId: this.giteaClientId, giteaClientId: this.giteaClientId,

Loading…
Cancel
Save