সত্যি বলতে, প্রচুর পরিমাণে প্রমাণীকরণ পদ্ধতি এবং কৌশল রয়েছে যা আপনি আপনার অ্যাপ্লিকেশনটিতে মাউন্ট করতে পারেন এবং এটি অ্যাপ্লিকেশন ব্যবসায়ের যুক্তি এবং প্রয়োজনীয়তার উপর নির্ভর করে।
উদাহরণস্বরূপ Oauth2, LDAP, স্থানীয় প্রমাণীকরণ ইত্যাদি
My আমার উত্তরটি ধরে নেয় আপনি স্থানীয় প্রমাণীকরণের সন্ধান করছেন যার অর্থ আপনি আপনার অ্যাপ্লিকেশনটিতে ব্যবহারকারীর পরিচয়গুলি পরিচালনা করছেন। সার্ভারকে অবশ্যই বাহ্যিক এপিআইয়ের একটি সেট প্রকাশ করতে হবে ব্যবহারকারীদের এবং প্রশাসকদের অ্যাকাউন্ট পরিচালনা করার অনুমতি এবং তারা কীভাবে বিশ্বাসযোগ্য যোগাযোগ অর্জনের জন্য সার্ভারে নিজেকে সনাক্ত করতে চান। আপনি ব্যবহারকারীর তথ্য ধারণ করে একটি ডিবি টেবিল তৈরি করবেন। সুরক্ষার উদ্দেশ্যে পাসওয়ার্ড হ্যাশ করা হয়েছে যেখানে ডাটাবেসে পাসওয়ার্ডটি কীভাবে সংরক্ষণ করবেন তা দেখুন See
নীচের একটি পদ্ধতির ভিত্তিতে ব্যবহারকারীদের অনুমোদনের জন্য অ্যাপের প্রয়োজনীয়তাগুলি ধরে নেওয়া যাক:
মৌলিক প্রমাণীকরণ (ব্যবহারকারীর নাম, পাসওয়ার্ড):
এই প্রমাণীকরণ পদ্ধতিটি বেস64 এ এনকোডড এবং আরএফসি 7617 এ সংজ্ঞায়িত অনুমোদনের শিরোনামের ব্যবহারকারী শংসাপত্রসমূহের উপর নির্ভর করে , যখন অ্যাপ্লিকেশন গ্রাহককে ডিকোড অনুমোদনের অনুরোধ জানায় এবং ডিবিতে এটির সাথে তুলনা করার জন্য পাসওয়ার্ডটি পুনরায় হ্যাশ করে এটি যদি ব্যবহারকারীর সাথে প্রমাণিত হয় তবে হ্যাশ অন্যথায় 401 স্থিতি কোডটি ব্যবহারকারীর কাছে ফিরিয়ে দেয়।
শংসাপত্র ভিত্তিক প্রমাণীকরণ:
এই প্রমাণীকরণ পদ্ধতিটি কোনও ব্যবহারকারীকে সনাক্ত করার জন্য ডিজিটাল শংসাপত্রের উপর নির্ভর করে এবং এটি x509 প্রমাণ হিসাবে পরিচিত, সুতরাং অ্যাপ্লিকেশনটি যখন ব্যবহারকারীকে অনুরোধ করে তখন এটি ক্লায়েন্টের শংসাপত্রটি পড়ে এবং যা সিএ রুট শংসাপত্রের সাথে মেলে তা যাচাই করে তা সরবরাহ করে provided অ্যাপ্লিকেশন।
বহনকারী টোকেন:
এই লেখার পদ্ধতিটি স্বল্প-স্থায়ী অ্যাক্সেস টোকেনগুলির উপর নির্ভর করে, বহনকারী টোকেন একটি ক্রিপ্টিক স্ট্রিং, সাধারণত লগইন অনুরোধের প্রতিক্রিয়া হিসাবে সার্ভার দ্বারা উত্পাদিত হয়। সুতরাং অ্যাপ্লিকেশনটি যখন ব্যবহারকারীকে অনুরোধ করে তখন এটি অনুমোদনটি পড়ে এবং ব্যবহারকারীকে প্রমাণীকরণের জন্য টোকেনটিকে বৈধতা দেয়।
তবে, আমি
প্রমাণীকরণ গ্রন্থাগারের জন্য গো-অভিভাবককে সুপারিশ করব যা এটি কৌশল হিসাবে পরিচিত প্রমাণীকরণ পদ্ধতির একটি এক্সটেনসিবল সেটটির মাধ্যমে করে। মূলত গো-গার্ডিয়ান রুটগুলি মাউন্ট করে না বা কোনও নির্দিষ্ট ডাটাবেস স্কিমাকে ধরে নেয় না, যা নমনীয়তা সর্বাধিক করে তোলে এবং বিকাশকারী দ্বারা সিদ্ধান্ত গ্রহণের অনুমতি দেয়।
গো-অভিভাবক শংসাপত্র স্থাপন করা সোজা is
উপরোক্ত পদ্ধতির পুরো উদাহরণ এখানে।
package main
import (
"context"
"crypto/x509"
"encoding/pem"
"fmt"
"io/ioutil"
"log"
"net/http"
"sync"
"github.com/golang/groupcache/lru"
"github.com/gorilla/mux"
"github.com/shaj13/go-guardian/auth"
"github.com/shaj13/go-guardian/auth/strategies/basic"
"github.com/shaj13/go-guardian/auth/strategies/bearer"
gx509 "github.com/shaj13/go-guardian/auth/strategies/x509"
"github.com/shaj13/go-guardian/store"
)
var authenticator auth.Authenticator
var cache store.Cache
func middleware(next http.Handler) http.HandlerFunc {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Println("Executing Auth Middleware")
user, err := authenticator.Authenticate(r)
if err != nil {
code := http.StatusUnauthorized
http.Error(w, http.StatusText(code), code)
return
}
log.Printf("User %s Authenticated\n", user.UserName())
next.ServeHTTP(w, r)
})
}
func Resource(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Resource!!\n"))
}
func Login(w http.ResponseWriter, r *http.Request) {
token := "90d64460d14870c08c81352a05dedd3465940a7"
user := auth.NewDefaultUser("admin", "1", nil, nil)
cache.Store(token, user, r)
body := fmt.Sprintf("token: %s \n", token)
w.Write([]byte(body))
}
func main() {
opts := x509.VerifyOptions{}
opts.KeyUsages = []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth}
opts.Roots = x509.NewCertPool()
// Read Root Ca Certificate
opts.Roots.AddCert(readCertificate("<root-ca>"))
cache = &store.LRU{
lru.New(100),
&sync.Mutex{},
}
// create strategies
x509Strategy := gx509.New(opts)
basicStrategy := basic.New(validateUser, cache)
tokenStrategy := bearer.New(bearer.NoOpAuthenticate, cache)
authenticator = auth.New()
authenticator.EnableStrategy(gx509.StrategyKey, x509Strategy)
authenticator.EnableStrategy(basic.StrategyKey, basicStrategy)
authenticator.EnableStrategy(bearer.CachedStrategyKey, tokenStrategy)
r := mux.NewRouter()
r.HandleFunc("/resource", middleware(http.HandlerFunc(Resource)))
r.HandleFunc("/login", middleware(http.HandlerFunc(Login)))
log.Fatal(http.ListenAndServeTLS(":8080", "<server-cert>", "<server-key>", r))
}
func validateUser(ctx context.Context, r *http.Request, userName, password string) (auth.Info, error) {
// here connect to db or any other service to fetch user and validate it.
if userName == "stackoverflow" && password == "stackoverflow" {
return auth.NewDefaultUser("stackoverflow", "10", nil, nil), nil
}
return nil, fmt.Errorf("Invalid credentials")
}
func readCertificate(file string) *x509.Certificate {
data, err := ioutil.ReadFile(file)
if err != nil {
log.Fatalf("error reading %s: %v", file, err)
}
p, _ := pem.Decode(data)
cert, err := x509.ParseCertificate(p.Bytes)
if err != nil {
log.Fatalf("error parseing certificate %s: %v", file, err)
}
return cert
}
ব্যবহার:
curl -k https://127.0.0.1:8080/login -u stackoverflow:stackoverflow
token: 90d64460d14870c08c81352a05dedd3465940a7
- একটি টোকেন দিয়ে প্রমাণীকরণ:
curl -k https://127.0.0.1:8080/resource -H "Authorization: Bearer 90d64460d14870c08c81352a05dedd3465940a7"
Resource!!
- ব্যবহারকারীর শংসাপত্রের সাথে প্রমাণীকরণ করুন:
curl -k https://127.0.0.1:8080/resource -u stackoverflow:stackoverflow
Resource!!
- ব্যবহারকারীর শংসাপত্রের সাথে প্রমাণীকরণ করুন:
curl --cert client.pem --key client-key.pem --cacert ca.pem https://127.0.0.1:8080/resource
Resource!!
আপনি একবারে একাধিক প্রমাণীকরণ পদ্ধতি সক্ষম করতে পারেন। আপনার সাধারণত কমপক্ষে দুটি পদ্ধতি ব্যবহার করা উচিত