使用 Vimine 登入
協會的會員使用自己的 Vimine 帳戶登入您的網站,並透過明確的同意,授權您使用他們的部分資料。這就是 OAuth 2.1 加 PKCE:密碼只在 Vimine 的頁面上輸入,絕不會在您的頁面上輸入;您的網站收到的權杖僅限於已授予的權限。
流程
章節「流程」- 會員點選後,您的網站把瀏覽器(頂層視窗,絕不能是 iframe)送到授權頁面:
https://app.vimine.network/authorize?client_id=vmc_…&redirect_uri=https://www.example.org/vimine/callback&response_type=code&state=…&code_challenge=…&code_challenge_method=S256&scope=profile:read%20membership:read
- 會員登入(如果尚未登入),並看到誰將獲得什麼權限。會員確認或取消。
- Vimine 把瀏覽器送回您的
redirect_uri,並帶上code和state(或error=access_denied)。 - 您的網站在
POST https://api.vimine.network/v1/oauth/token交換授權碼(grant_type=authorization_code、code、code_verifier、client_id、redirect_uri),獲得一個存取權杖(10 分鐘)和一個重新整理權杖(輪換;30 天,閒置 14 天即失效)。
SDK 會為您完成以上全部步驟。
使用 SDK
章節「使用 SDK」import { Vimine } from '@vimine/sdk';
const vimine = new Vimine({ clientId: 'vmc_…', redirectUri: 'https://www.example.org/vimine/callback', scopes: ['profile:read', 'membership:read']});
// 由點選觸發:`returnTo` 是您自己的狀態,回呼之後會原樣交還給您document.querySelector('#sign-in').addEventListener('click', () => vimine.signIn({ returnTo: location.pathname }));const result = await vimine.handleRedirect(); // URL 中沒有登入參數時傳回 nullif (result) location.replace(result.returnTo || '/');signIn() 的選項:
| 選項 | 作用 |
|---|---|
scopes |
本次登入要申請的權限(預設:建構函式中的權限,或 profile:read membership:read) |
prompt: 'login' |
即使存在有效的 Vimine 工作階段,也強制顯示登入表單 |
prompt: 'consent' |
始終顯示授權同意頁面 |
returnTo |
您自己的狀態(例如會員開始登入時所在的頁面),儲存在本機,由 handleRedirect() 傳回 |
會員取消時,handleRedirect() 拋出 code 為 access_denied 的 VimineError;當返回與本瀏覽器發起的登入不符時,拋出 state_mismatch 或 no_flow。
工作階段
章節「工作階段」- 權杖儲存在
sessionStorage中(每個分頁各自獨立)。storage: 'local'讓多個分頁共享權杖並同步登出;'memory'則從不持久儲存。您也可以傳入自己的配接器。 vimine.getAccessToken()會在權杖到期前 30 秒自動重新整理;收到 401 的呼叫會在重新整理後重試一次。重複使用的重新整理權杖(例如被複製的權杖)會撤銷整個工作階段系列。vimine.onChange(session => …)會通知登入、重新整理和登出。vimine.getSession().sub是會員在您的協會中的識別碼(vms_…):長期穩定,在每個協會中都不同,絕不是內部 id。
您可以請求的內容
章節「您可以請求的內容」await vimine.me.get(); // profile:readawait vimine.me.update({ phone: '+39 …' }); // profile:writeawait vimine.membership.get(); // membership:read — status, verdict, expires_at, statuto, cardawait vimine.membership.events({ limit: 20 }); // 狀態歷史await vimine.membership.statuto(); // 現行章程,以及會員是否已接受await vimine.membership.acceptStatuto({ version: 3 }); // statuto:acceptawait vimine.membership.request({ accept_statuto: { version: 3 }, privacy_notice: { version: 2 } }); // membership:request → 待處理的會員卡await vimine.membership.card(); // 會員卡權杖(QR Code)及其有效時段await vimine.legal.acceptances(); // legal:read → 已接受的內容和尚待確認的內容await vimine.legal.record({ kind: 'privacy_notice', version: 2 }); // legal:accept → 確認已閱讀協會的隱私權聲明await vimine.connections.list(); await vimine.connections.revoke('vmc_…');verdict 是入場時真正要看的結果:valid、expired、statuto_required(重新接受章程已逾期)或 inactive。尚未入會的人也可以登入並使用 membership.request:非會員同樣可以同意入會相關的權限;其他權限則要求在該協會持有會員卡。
登出
章節「登出」await vimine.signOut(); // 撤銷 API 工作階段並將其清除await vimine.signOut({ everywhere: true }); // 同時結束會員的 Vimine 工作階段,然後回到您的網站使用 everywhere 時,瀏覽器會經過 https://app.vimine.network/oauth/logout?client_id=…&post_logout_redirect_uri=…;返回網址必須位於為該用戶端登記的來源上。當會員登出 Vimine 時,其所有應用的 API 工作階段都會被撤銷(單一登出);當會員在已連結的應用程式中撤銷某個應用或重設密碼時,也是如此。
不使用 SDK
章節「不使用 SDK」如果您無法使用 SDK(其他程式語言、低程式碼平臺),該流程就是標準的 OAuth 2.1。
授權——GET https://app.vimine.network/authorize
| 參數 | |
|---|---|
client_id |
您的 vmc_… |
redirect_uri |
已登記的網址之一,必須完全一致 |
response_type |
code |
state |
隨機值,返回時用於比對 |
code_challenge、code_challenge_method |
PKCE,僅支援 S256 |
scope |
以空格分隔的權限 |
prompt |
可選:login、consent |
ui_locales |
可選:Vimine 支援的語言之一——it(預設)、en、zh-Hans、zh-Hant、fr、es、de、pt-BR |
交換——POST https://api.vimine.network/v1/oauth/token,請求本文為 application/x-www-form-urlencoded:
grant_type=authorization_code&code=…&code_verifier=…&client_id=vmc_…&redirect_uri=…{ "access_token": "…", "token_type": "Bearer", "expires_in": 600, "refresh_token": "…", "scope": "profile:read membership:read", "sub": "vms_…" }重新整理——同一端點,使用 grant_type=refresh_token&refresh_token=…&client_id=…:回應中帶有一個新的重新整理權杖(舊權杖為並行請求再保持有效 15 秒,此後再使用它會撤銷整個工作階段系列)。
撤銷——POST /v1/oauth/revoke,參數為 token=…&token_type_hint=refresh_token(RFC 7009)。
發現——GET https://api.vimine.network/.well-known/oauth-authorization-server(RFC 8414)列出端點、scope 和支援的方法。
這些端點的錯誤採用 OAuth 格式:{ "error": "invalid_grant", "error_description": "…" }。