เข้าสู่ระบบด้วย OAuth2
ส่งผู้คนไปที่ Hivesigner เพื่อเข้าสู่ระบบแอปของคุณ พวกเขาตรวจดูคำขอของคุณที่นั่นแล้วอนุมัติ จากนั้น Hivesigner ส่งพวกเขากลับมาที่ callback ของคุณพร้อมโทเค็น (โฟลว์แบบโทเค็น) หรือพร้อมโค้ดที่เซิร์ฟเวอร์ของคุณนำไปแลกเป็นโทเค็น (โฟลว์แบบโค้ด) หน้านี้ครอบคลุมทั้งสองโฟลว์ พารามิเตอร์ทุกตัว และขอบเขตสิทธิ์
ก่อนเริ่ม
- ลงทะเบียนแอปของคุณ: มีบัญชี Hive สำหรับแอป พร้อมใส่รายการ callback ไว้ ดู ลงทะเบียนแอปของคุณ
- หากต้องการกระจายธุรกรรมผ่าน API บัญชีแอปของคุณยังต้อง ให้สิทธิ์ posting แก่ @hivesigner ด้วย
- สำหรับโฟลว์แบบโค้ด ให้ตั้ง ไคลเอ็นต์ซีเคร็ต
URL อนุญาต
ส่งผู้ใช้ไปที่ที่อยู่นี้
https://hivesigner.com/oauth2/authorize?client_id=CLIENT_ID&redirect_uri=REDIRECT_URI&scope=SCOPE&state=STATE
เข้ารหัสทุกค่าให้เหมาะกับ URL URLSearchParams ทำให้คุณได้
import { randomBytes } from 'node:crypto';
const state = randomBytes(16).toString('hex');
// Store `state` in the user's session before you redirect (see "Protect the request with state").
const params = new URLSearchParams({
client_id: 'myapp',
redirect_uri: 'https://myapp.example/auth/callback',
scope: 'posting',
state,
});
const authorizeUrl = `https://hivesigner.com/oauth2/authorize?${params}`;
พารามิเตอร์
| พารามิเตอร์ | จำเป็น | ทำอะไร |
|---|---|---|
client_id |
ใช่ สำหรับแอป | ชื่อบัญชีแอปของคุณ และระบบอ่าน clientId ด้วย หากไม่มี คำขอจะกลายเป็นคำขอเข้าสู่ระบบอย่างเดียวจากเว็บไซต์ที่ไม่มีบัญชีแอป ดู เข้าสู่ระบบโดยไม่มีสิทธิ์ posting |
redirect_uri |
ใช่ | ที่ที่ Hivesigner จะส่งผู้ใช้กลับไป ต้องตรงกับ URI สำหรับเปลี่ยนเส้นทางของแอปคุณอย่างใดอย่างหนึ่งพอดี ดู callback |
scope |
ไม่ | login, posting หรือ offline ดู ขอบเขตสิทธิ์ หากไม่มี คำขอจะขอสิทธิ์ posting |
response_type |
ไม่ | ค่า code เริ่ม โฟลว์แบบโค้ด ค่าอื่นหรือไม่ใส่เลยหมายถึง โฟลว์แบบโทเค็น |
state |
แนะนำ | ค่าสุ่มที่ Hivesigner ส่งกลับมาโดยไม่เปลี่ยนแปลง ดู ป้องกันคำขอด้วย state |
account |
ไม่ | ชื่อผู้ใช้ Hive เมื่อบัญชีนั้นอยู่บนอุปกรณ์ของผู้ใช้ Hivesigner จะเลือกให้ ถ้าไม่มีก็ไม่สนใจ และระบบอ่าน select_account ด้วย |
ผู้ใช้ยังสลับไปบัญชีอื่นบนหน้าจอยินยอมได้ ให้เอาบัญชีจากโทเค็นหรือจากการแลกโค้ดเสมอ อย่าเอาจากสิ่งที่คุณขอไป
ขอบเขตสิทธิ์
Hive มีสิทธิ์ posting เพียงชุดเดียว Hivesigner จึงมีระดับการเข้าถึงสองระดับ คือเข้าสู่ระบบอย่างเดียวกับ posting และไม่มีอะไรละเอียดกว่านั้นคั่นกลาง
scope |
สิ่งที่ผู้ใช้อนุมัติ | โฟลว์ | type ของโทเค็นการเข้าถึง |
|---|---|---|---|
login |
«ดูชื่อผู้ใช้ของบัญชีคุณ» ไม่มีการให้สิทธิ์ใด | โฟลว์แบบโทเค็น (อย่าใส่ response_type=code) |
login |
posting |
สิทธิ์ posting ครั้งแรกจะเพิ่มบัญชีแอปของคุณเข้าไปในสิทธิ์ posting ของผู้ใช้ | โฟลว์แบบโทเค็น หรือโฟลว์แบบโค้ดพร้อม response_type=code |
posting |
offline |
สิทธิ์ posting เช่นเดียวกับด้านบน | โฟลว์แบบโค้ด | posting พร้อมโทเค็น refresh |
ในโฟลว์แบบโค้ด callback จะได้รับโค้ดก่อน (โทเค็นที่ type เป็น code) ซึ่งเซิร์ฟเวอร์ของคุณนำไปแลกเป็นโทเค็นการเข้าถึง
- ไม่ระบุขอบเขต หมายถึง
posting - ค่าที่มีคำว่า
offlineอยู่ตรงไหนก็ตาม หมายถึงofflineเช่นค่าเดิมอย่างoffline,vote,comment - ค่าอื่นใด หมายถึง
postingรวมถึงชื่อการดำเนินการแบบเก่าอย่างvote,comment,vote,comment,comment_optionsหรือcustom_jsonค่าเหล่านี้ไม่จำกัดโทเค็น เพราะโทเค็น posting ทุกอันอนุญาตการดำเนินการชุดเดียวกัน ดู broadcast รับอะไรบ้าง
ขอ login เมื่อแอปของคุณต้องการรู้เพียงว่าผู้ใช้เป็นใคร ดู เข้าสู่ระบบโดยไม่มีสิทธิ์ posting
โฟลว์แบบโทเค็น
เบราว์เซอร์ของผู้ใช้ได้รับโทเค็นการเข้าถึงโดยตรง แอปของคุณไม่ต้องใช้ซีเคร็ตใด
-
ส่งผู้ใช้ไปยัง URL อนุญาต
https://hivesigner.com/oauth2/authorize?client_id=CLIENT_ID&redirect_uri=REDIRECT_URI&scope=posting&state=STATE -
ผู้ใช้อนุมัติ Hivesigner เปลี่ยนเส้นทางไปยัง callback ของคุณ
REDIRECT_URI?state=STATE&access_token=ACCESS_TOKEN&expires_in=604800&username=USERNAMEHivesigner เติมพารามิเตอร์ของตนด้วย
?เมื่อ callback ของคุณไม่มีสตริงคำค้น และด้วย&เมื่อมี ส่วนstateจะมีก็ต่อเมื่อคุณส่งค่าที่ไม่ว่างไป -
ที่ callback ของคุณ ให้ เทียบ
stateก่อน แล้วจึง ตรวจสอบโทเค็น บนเซิร์ฟเวอร์ของคุณ บัญชีที่โทเค็นเป็นของเขาอยู่ในตัวโทเค็นเอง อย่าพึ่งพาพารามิเตอร์usernameเพียงอย่างเดียว เพราะใครก็แก้ URL ได้ -
เก็บโทเค็นไว้บนเซิร์ฟเวอร์ของคุณหรือในคุกกี้ httpOnly แล้วเปลี่ยนเส้นทางไป URL ที่สะอาด เพื่อให้โทเค็นหายไปจากแถบที่อยู่
-
ใช้โทเค็นกับ API จนกว่ามันจะหมดอายุหลัง
expires_inวินาที (7 วัน) แล้วส่งผู้ใช้ไปยัง URL อนุญาตอีกครั้ง คนที่เคยให้สิทธิ์ posting แล้วจะเห็น «เข้าสู่ระบบ APP» และ «คุณเคยอนุญาต @myapp แล้ว จะไม่มีการให้สิทธิ์ใหม่เพิ่ม»
โฟลว์แบบโค้ด
เซิร์ฟเวอร์ของคุณได้รับโค้ดแล้วนำไปแลกเป็นโทเค็นการเข้าถึงและโทเค็นรีเฟรช หลังจากนั้นก็ต่ออายุได้เองโดยไม่ต้องมีผู้ใช้ ใช้วิธีนี้เมื่อเซิร์ฟเวอร์ของคุณทำงานแทนผู้ใช้เป็นเวลานาน
-
ส่งผู้ใช้ไปยัง URL อนุญาตพร้อม
scope=offlinehttps://hivesigner.com/oauth2/authorize?client_id=CLIENT_ID&redirect_uri=REDIRECT_URI&scope=offline&state=STATEscope=posting&response_type=codeให้ผลเหมือนกัน -
ผู้ใช้อนุมัติสิทธิ์ posting Hivesigner เปลี่ยนเส้นทางไปยัง callback ของคุณ
REDIRECT_URI?code=CODE&state=STATE&username=USERNAME -
เทียบ
stateแล้วแลกโค้ดทันทีจากเซิร์ฟเวอร์ของคุณ
แลกโค้ด
ส่งโค้ดและไคลเอ็นต์ซีเคร็ตของคุณไปยัง /api/oauth2/token ในเนื้อหาของคำขอ POST
curl -X POST https://hivesigner.com/api/oauth2/token \
-H 'Content-Type: application/json' \
-d '{"code": "CODE", "client_secret": "CLIENT_SECRET"}'
คำตอบ
{
"access_token": "ACCESS_TOKEN",
"refresh_token": "REFRESH_TOKEN",
"expires_in": 604800,
"username": "alice"
}
การเรียกแบบเดียวกันใน Node.js 18 ขึ้นไป
const TOKEN_URL = 'https://hivesigner.com/api/oauth2/token';
export async function hivesignerTokens(grant) {
const res = await fetch(TOKEN_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
...grant,
client_secret: process.env.HIVESIGNER_CLIENT_SECRET,
}),
});
const data = await res.json();
if (!res.ok || data.error) {
throw new Error(`${data.error}: ${data.error_description}`);
}
return data; // { access_token, refresh_token, expires_in, username }
}
// On your callback, after checking state:
const tokens = await hivesignerTokens({ code: req.query.code });
- ใส่โค้ดและซีเคร็ตไว้ในเนื้อหาของคำขอ อย่าใส่ใน URL
- อย่าส่งเฮดเดอร์
Authorizationมากับคำขอนี้ - ใช้
usernameจากคำตอบนี้ ค่านี้มาจากโค้ดที่ผู้ใช้ลงนาม - เก็บโทเค็นการเข้าถึงและโทเค็นรีเฟรชไว้บนเซิร์ฟเวอร์ของคุณ
รีเฟรช
เมื่อโทเค็นการเข้าถึงหมดอายุ ให้ส่งโทเค็นรีเฟรชพร้อมไคลเอ็นต์ซีเคร็ตของคุณไปยังปลายทางเดิม
curl -X POST https://hivesigner.com/api/oauth2/token \
-H 'Content-Type: application/json' \
-d '{"refresh_token": "REFRESH_TOKEN", "client_secret": "CLIENT_SECRET"}'
const renewed = await hivesignerTokens({ refresh_token: stored.refresh_token });
คำตอบมีรูปแบบเดิม พร้อมโทเค็นการเข้าถึงใหม่และโทเค็นรีเฟรชใหม่ ให้เก็บทั้งสองแทนของเดิม
ป้องกันคำขอด้วย state
หากไม่มี state เว็บไซต์อื่นอาจส่งผู้ใช้ของคุณมาที่ callback ของคุณพร้อมโทเค็นหรือโค้ดที่มันเลือกเอง แอปของคุณก็จะพาผู้ใช้เข้าสู่ระบบบัญชีของคนอื่น state ผูกการกลับมาทุกครั้งเข้ากับเบราว์เซอร์ที่เริ่มการเข้าสู่ระบบ
- สร้างค่าสุ่มสำหรับการเข้าสู่ระบบแต่ละครั้ง อย่างน้อย 16 ไบต์สุ่ม เลขฐานสิบหกช่วยให้ค่านี้ไม่มีอักขระที่ต้องเข้ารหัส
- เก็บไว้ในที่ที่มีเพียงเบราว์เซอร์นี้เท่านั้นที่แสดงกลับมาได้ เช่นเซสชันของเซิร์ฟเวอร์ หรือคุกกี้อายุสั้นแบบ httpOnly และ Secure ที่ตั้ง
SameSite=Lax - ส่งค่านั้นเป็น
stateใน URL อนุญาต - ที่ callback ของคุณ ให้เทียบพารามิเตอร์
stateกับค่าที่เก็บไว้ ถ้าไม่มีหรือไม่ตรงกัน ให้หยุด อย่าใช้ทั้งโทเค็นและโค้ด - ลบค่าที่เก็บไว้ เพื่อให้แต่ละค่าใช้ได้เพียงครั้งเดียว
app.get('/auth/callback', async (req, res) => {
const expected = req.session.hivesignerState;
delete req.session.hivesignerState;
if (!expected || req.query.state !== expected) {
return res.status(400).send('This sign-in has expired. Please try again.');
}
// Token flow: req.query.access_token. Code flow: req.query.code.
});
Hivesigner ส่งค่า state กลับมาเหมือนที่ได้รับไป ส่วนค่าว่างจะถูกละไว้
ผู้ใช้เห็นอะไร
หน้าจอยินยอมแสดงรูปและชื่อแอปของคุณ «บัญชี Hive @myapp» และ «จะพาคุณไปที่ HOST» โดย HOST มาจาก callback ของคุณ จากนั้น
- คำขอ posting ครั้งแรก หัวข้อเขียนว่า «APP กำลังขอสิทธิ์เข้าถึงบัญชีของคุณ» การ์ด ขอบเขต แสดงรายการสิ่งที่แอปของคุณจะทำได้ ประกาศหนึ่งเขียนว่า «การอนุญาตครั้งแรก: การดำเนินการนี้จะเพิ่ม @myapp ลงในสิทธิ์ posting ของคุณบนเชน และต้องใช้คีย์ active ของคุณหนึ่งครั้ง บัญชีดังกล่าวจะสามารถโพสต์ในนามของคุณได้จนกว่าคุณจะเพิกถอนสิทธิ์» ปุ่มเขียนว่า อนุญาต เมื่ออุปกรณ์ของผู้ใช้ไม่มีคีย์ active ของบัญชีนั้น หน้าจอจะขอคีย์ตรงนั้นเลย
- เข้าสู่ระบบ สำหรับ
scope=loginหรือสำหรับสิทธิ์ posting ที่ผู้ใช้เคยให้ไว้แล้ว หัวข้อเขียนว่า «เข้าสู่ระบบ APP» และปุ่มเขียนว่า เข้าสู่ระบบ - บัญชี «อนุญาตในนาม» หรือ «เข้าสู่ระบบในนาม» ตามด้วยบัญชีที่เลือกไว้ ผู้ใช้เปลี่ยนบัญชีได้ตรงนี้
- บัญชีที่ล็อกอยู่ เหนือปุ่มจะมีช่องรหัสผ่าน คลิกครั้งเดียวก็ปลดล็อกบัญชีและไปต่อ
- ไม่มีบัญชีบนอุปกรณ์ ปุ่มเขียนว่า ดำเนินการต่อ ปุ่มนี้เปิดแบบฟอร์มเพิ่มบัญชี แล้วพากลับมาที่คำขอ
หลังคำขอ posting ครั้งแรก Hivesigner จะรอจนการให้สิทธิ์ใหม่ปรากฏบนเชนก่อนจึงเปลี่ยนเส้นทาง ซึ่งอาจใช้เวลาไม่กี่วินาที หากต้องการดูหน้าจอทั้งหมดจากฝั่งผู้ใช้ ดู เข้าสู่ระบบแอป
การยกเลิกและคำขอที่ถูกปฏิเสธ
- การยกเลิก ผู้ใช้จะไปยังรายการบัญชีของตนใน Hivesigner ไม่มีอะไรถูกส่งไปยัง callback ของคุณ และไม่มีพารามิเตอร์ข้อผิดพลาดใด ให้เปิดปุ่มเข้าสู่ระบบของคุณไว้เพื่อให้ผู้ใช้เริ่มใหม่ได้ และอย่ารอการกลับมา
- คำขอที่ถูกปฏิเสธ callback ที่ไม่ได้ลงทะเบียน
client_idที่ไม่รู้จัก หรือredirect_uriที่ขาดหายไป จะทำให้ Hivesigner แสดงข้อผิดพลาดพร้อมปุ่ม รายงานปัญหานี้ และไม่มีอะไรถูกส่งไปยัง callback ของคุณ ดู ผู้ใช้เห็นอะไรเมื่อมีบางอย่างผิดพลาด
URL คำขอเข้าสู่ระบบแบบเดิม
Hivesigner ยังรับ URL เข้าสู่ระบบแบบเก่าอยู่ ซึ่งเก็บไว้เพื่อการเชื่อมต่อในอดีต สำหรับงานใหม่ให้ใช้ /oauth2/authorize
https://hivesigner.com/login-request/CLIENT_ID?redirect_uri=REDIRECT_URI&scope=posting&state=STATE
มันเปิดหน้าจอยินยอมเดียวกัน ด้วยการตรวจ callback แบบเดียวกันและการเปลี่ยนเส้นทางแบบเดียวกัน แต่อ่านพารามิเตอร์ต่างออกไป
scopeเป็นloginหรือpostingค่าอื่นหรือไม่ใส่เลยหมายถึงlogin- ไม่อ่าน
offlineสำหรับโฟลว์แบบโค้ดให้เติมresponse_type=code - ไม่อ่าน
account
https://hivesigner.com/login?client_id=CLIENT_ID&redirect_uri=REDIRECT_URI ใช้กฎชุดเดียวกัน