بقلم مارك تسي
ما هو OAuth 2.0؟
OAuth 2.0 هو إطار عمل مصادقة قياسي مفتوح يوفر تدفقات مصادقة متعددة ، بما في ذلك تدفق OAuth ثلاثي الأرجل الذي يدعمه الآن Brightspace. يسمح للمطورين بكتابة التطبيقات التي تصل إلى خدمات مختلفة نيابة عن المستخدم.
الجمهور المستهدف
يستهدف هذا المنشور المطورين الذين يتطلعون إلى كتابة التطبيقات التي تستخدم واجهات برمجة تطبيقات Brightspace. نحن ندعم الآن مواصفات OAuth 2.0 للمصادقة ثلاثية الأرجل بالإضافة إلى مواصفات تفويض مفتاح المعرف الحالية.
يتوفر مزيد من المعلومات عبر منشور مدونة OAuth 2.0 Q&A بما في ذلك معلومات حول ما يعنيه هذا لتفويض مفتاح المعرف ، والاختلافات بين الاثنين.
الشروع
الهدف من OAuth ثلاثي الأرجل للمطورين هو الحصول على رمز الوصول يسمح لتطبيق تابع لجهة خارجية بالوصول إلى مورد المستخدم (على سبيل المثال، التقديرات عبر واجهات برمجة تطبيقات التطبيقات) نيابة عن المستخدم.
الكيانات
هناك أربعة كيانات تشارك في OAuth ثلاثي الأرجل:
- واجهات برمجه التطبيقات
- على سبيل المثال ، واجهات برمجة تطبيقات التطبيقات أو البيانات الخاصة بنا
- يعرف أيضا باسم خادم الموارد في المواصفات الرسمية
- تطبيق
- تطبيق تابع لجهة خارجية يستخدم واجهات برمجة التطبيقات الخاصة بنا
- يعرف أيضا باسم عميل في المواصفات الرسمية
- خادم التفويض
- الأحكام الرموز المميزة للوصول من بين مسؤوليات أخرى
- يتم استضافة خادم تفويض Brightspace على auth.brightspace.com
- مستخدم
- على سبيل المثال طالب أو مدرس
- يعرف أيضا باسم مالك المورد في المواصفات الرسمية
تسجيل الطلب
- بصفتك مسؤول نظام، انتقل إلى الرمز إدارة قابلية التوسعة أداة المسؤول.
- انقر فوق الزر OAuth 2.0 التبويب.
- انقر فوق الزر تسجيل تطبيق زر.
- تسجيل نموذج الطلب. على سبيل المثال، استخدم القيم التالية:
بعد التسجيل ، سيظهر لك معرف العميل و سر العميل، والتي ستحتاجها في القسم التالي.
يتوفر مزيد من المعلومات حول تسجيل الطلبات في قسم OAuth 2.0 في مرجع واجهة برمجة التطبيقات توثيق.
تجول مثال على التعليمات البرمجية
لقد أنشأنا نموذج التطبيق استخدام أبدى لمساعدة المطورين على الاستفادة من OAuth 2.0. سيبدأ هذا التطبيق تدفق OAuth ثلاثي الأرجل للحصول على رمز وصول مميز لمستخدم معين، ثم استدعاء الرمز المميز واجهة برمجة تطبيقات whoami باستخدام هذا الرمز المميز.
سيقوم المستخدم بتقديم العديد من طلبات الويب إلى التطبيق أثناء التدفق، ويحدد التطبيق مسارا لكل طلب من هذه الطلبات. ستمر الإرشادات التفصيلية التالية عبر كل مسار بالترتيب الذي سيواجهه المستخدم.
1. يزور المستخدم الصفحة المقصودة للتطبيق ، والتي تحتوي على زر الحصول على البيانات:
app.get('/', function(req, res) {
إرجاع صفحة HTML مع زر "الحصول على البيانات"
res.render('index');
});
2. يستدعي الزر الحصول على البيانات مسار / المصادقة الذي يتسبب في قيام التطبيق بتنفيذ طلب تخويل. يقوم التطبيق بذلك عن طريق صياغة URI للطلب (نقطة نهاية على خادم التخويل الخاص بنا)، وإعادة توجيه المستخدم إلى عنوان URI هذا:
app.get('/auth', function(req, res) {
var authCodeParams = querystring.stringify({
response_type: "الرمز",
redirect_uri: getRedirectUri(req) ،
client_id: process.env.CLIENT_ID ،
النطاق: "النواة:* ",
state: "NotASecureState_rfc6749_section_10.12"
});
res.redirect(authCodeEndpoint + "؟" + authCodeParams);
});
3. سيطلب من المستخدم تسجيل الدخول باستخدام بيانات اعتماد Brightspace الخاصة به (إذا لم يتم تسجيل الدخول بالفعل). عند تسجيل الدخول بنجاح ، سيتم تقديم صفحة للمستخدم حيث يمكنه تأكيد ما إذا كان يسمح للتطبيق بالتصرف نيابة عنه. هذه الخطوة جزء من طلب تفويض، ولكن لا يتضمن التطبيق.
4. توفر خدمة التفويض استجابة التفويض إلى التطبيق عن طريق إعادة توجيه المستخدم مرة أخرى إلى التطبيق. يعتمد هذا على إعادة توجيه URI القيمة المقدمة أثناء تسجيل الطلب.
لنلق نظرة على كل مكون من مكونات تعريف المسار هذا على حدة:
a. يؤدي هذا إلى تسجيل مسار معاودة الاتصال الذي سيعيد خادم التخويل توجيه المستخدم إليه:
app.get('/callback', function(req, res) { ... }
b. باستخدام رمز التفويض من استجابة التفويض، بالإضافة إلى بيانات اعتماد التطبيق، يقوم التطبيق بتقديم طلب رمز مميز للوصول:
var authorizationCode = req.query.code;
حمولة var = {
grant_type: "authorization_code",
redirect_uri: getRedirectUri(req) ،
الرمز: authorizationCode};
طلب
.post(tokenEndpoint)
.auth(process.env.CLIENT_ID، process.env.CLIENT_SECRET)
.type('النموذج')
.send (الحمولة)
.end( ... )
c. مهمعلى الرغم من عدم عرضه، يجب أن يتحقق التطبيق أيضا من السمة حالة للتأكد من أن لها نفس القيمة التي أرسلناها إلى خادم التخويل. هذا يضمن /رد لا تعالج نقطة النهاية رموز التخويل التي لم يطلبها التطبيق. لهذا السبب ، فإن حالة يجب أن تكون القيمة المرسلة إلى خادم التفويض في طلب التفويض قيمة غير قابلة للتخمين.
د. ستحتوي استجابة رمز الوصول المميز على رمز وصول يسمح للتطبيق باستدعاء واجهات برمجة التطبيقات نيابة عن المستخدم. نقوم بتخزين هذه القيمة في ملف تعريف ارتباط من أجل البساطة حتى نتمكن من إجراء استدعاء واجهة برمجة التطبيقات في الخطوة التالية:
function(err, postResponse) {
إذا (خطأ) {
console.log(
"خطأ في رمز الوصول",
استجابة خطأ || خطئ
);
res.redirect('/');
} else {
res.cookie(
اسم ملف تعريف الارتباط,
{ accessToken: postResponse.body.access_token } ،
ملفات تعريف الارتباط
);
res.redirect('/data');
}});
e. وضع كل ذلك معا:
app.get('/callback', function(req, res) {
var authorizationCode = req.query.code;
حمولة var = {
grant_type: "authorization_code",
redirect_uri: getRedirectUri(req) ،
الرمز: authorizationCode
};
طلب
.post(tokenEndpoint)
.auth(process.env.CLIENT_ID، process.env.CLIENT_SECRET)
.type('النموذج')
.send (الحمولة)
.end(function(err, postResponse) {
إذا (خطأ) {
console.log(
"خطأ في رمز الوصول",
استجابة خطأ || خطئ
);
res.redirect('/');
} else {
res.cookie(
اسم ملف تعريف الارتباط,
{ accessToken: postResponse.body.access_token } ،
ملفات تعريف الارتباط
);
res.redirect('/data');
}
});
});
5. يستخدم التطبيق رمز الوصول المميز لاستدعاء واجهات برمجة التطبيقات نيابة عن المستخدم:
app.get('/data', function(req, res) {
var access_token = req.cookies[cookieName].accessToken;
طلب
.get(process.env.HOST_URL + '/d2l/api/lp/1.10/users/whoami')
.set('التفويض', 'حامل ${access_token}')
.end(الوظيفة (خطأ ، استجابة) {
إذا (خطأ) {
var errorMessage = JSON.stringify(خطأ, فارغ, 2);
console.log(errorMessage);
res.send('${errorMessage}
');
} else {
var locals = {
البيانات: JSON.stringify(
JSON.parse(response.text || '{}'),
صِفْر
2
)
};
res.render('البيانات', السكان المحليين);
}
});
});