কীভাবে লোকেরা গোতে প্রমাণীকরণ পরিচালনা করছে? [বন্ধ]


187

গোয়াদের মধ্যে RESTful API গুলি এবং জেএস ফ্রন্ট-এন্ড অ্যাপ্লিকেশন তৈরি করার জন্য, আপনি কীভাবে প্রমাণীকরণ পরিচালনা করছেন? আপনি কি কোনও বিশেষ গ্রন্থাগার বা কৌশল ব্যবহার করছেন?

আমি এই সম্পর্কে এত কম আলোচনা খুঁজে অবাক। আমি নীচের মত উত্তরগুলি মাথায় রাখি, এবং নিজের বাস্তবায়ন বিকাশ এড়াতে চেষ্টা করছি:

এএসপি.নেটে প্রমাণীকরণের ফর্ম

সবাই কি আলাদা আলাদাভাবে নিজের সমাধান কোডিং করছে?


5
প্রমাণীকরণ আপনি যে ধরণের অ্যাপ্লিকেশন পরে যাচ্ছেন তার উপর অনেক বেশি নির্ভর করে। কোনও আকারের-ফিট-সব সমাধান নেই। অতিরিক্তভাবে, এটি সমাধান করা একটি কঠিন সমস্যা। এটি সম্ভবত আপনি কোনও চূড়ান্ত নথি খুঁজে পাবেন না কেন This
জিমট

21
আরে, দ্রুত প্রতিক্রিয়া জন্য ধন্যবাদ। বোঝা গেছে, তবে বেশিরভাগ ভাষা এবং ফ্রেমওয়ার্কগুলি প্রমাণীকরণের সমাধান নিয়ে আসে যা বেশিরভাগ অ্যাপ্লিকেশন দ্বারা ভাগ করা সর্বাধিক সাধারণ প্রমাণীকরণের প্রয়োজনীয়তাগুলিকে আচ্ছাদন করে এবং সম্প্রদায়ের সম্প্রদায়ের অংশগ্রহণ এবং সমর্থন রয়েছে। আমি একমত যে এটি একটি কঠিন সমস্যা। যারা সহযোগী প্রচেষ্টা থেকে সবচেয়ে বেশি উপকৃত হয় না? (এটি কোনও অভিযোগ নয়, কারণ এটি ওপেন সোর্স, তবে আরও একটি পর্যবেক্ষণ যা আমরা সকলেই
চাকাটিকে নতুনভাবে উদ্ভাবন

12
@ জিম্ট এটি একটি কঠিন সমস্যা যেটি ভুল হতে পারে না এমন একটি সংক্ষিপ্ত সমাধান দিয়ে আমাদের মরণশীল সরবরাহ করা আরও গুরুত্বপূর্ণ করে তোলে।
tymtam

আমি এই প্রশ্নটিকে অফ-টপিক হিসাবে বন্ধ করতে ভোট দিচ্ছি কারণ এটি একটি পোল প্রশ্ন।
ফ্লিমজি

উত্তর:


115

এই প্রশ্নটি একটি টন ভিউ পেয়েছে - এবং এটির একটি জনপ্রিয় প্রশ্ন ব্যাজ রয়েছে - তাই আমি জানি যে এই বিষয়ে অনেক সুপ্ত আগ্রহ রয়েছে, এবং অনেক লোক হুবহু একই জিনিস জিজ্ঞাসা করছে এবং ইন্টারভিউগুলিতে উত্তর খুঁজে পাচ্ছে না।

হাতের avyেউয়ের জিনিসগুলির পাঠ্য সমতুল্য, বেশিরভাগ উপলভ্য তথ্যের ফলাফল "পাঠকের অনুশীলন" হিসাবে ছেড়ে গেছে। ;)

তবে আমি শেষ পর্যন্ত একটি কংক্রিটের উদাহরণ খুঁজে পেয়েছি, (উদারভাবে) গোলং-বাদাম মেলিং তালিকার সদস্য দ্বারা সরবরাহ করা:

https://groups.google.com/forum/#!msg/golang-nuts/GE7a_5C5kbA/fdSnH41pOPYJ

এটি কাস্টম প্রমাণীকরণের ভিত্তি হিসাবে প্রস্তাবিত স্কিমা এবং সার্ভার-সাইড বাস্তবায়ন সরবরাহ করে। ক্লায়েন্ট-সাইড কোডটি এখনও আপনার হাতে।

(আমি আশা করি পোস্টটির লেখক এটি দেখেছেন: ধন্যবাদ!)

উদ্ধৃত (এবং পুনরায় ফর্ম্যাট করা):


"আমি নিম্নলিখিত ডিজাইনের মতো কিছু প্রস্তাব করব:

create table User (
 ID int primary key identity(1,1),
 Username text,
 FullName text,
 PasswordHash text,
 PasswordSalt text,
 IsDisabled bool
)

create table UserSession (
 SessionKey text primary key,
 UserID int not null, -- Could have a hard "references User"
 LoginTime <time type> not null,
 LastSeenTime <time type> not null
)
  • যখন কোনও ব্যবহারকারী টিএলএস এর অধীনে কোনও পোষ্টের মাধ্যমে আপনার সাইটে লগ ইন করেন, পাসওয়ার্ডটি বৈধ কিনা তা নির্ধারণ করুন।
  • তারপরে একটি এলোমেলো সেশন কী জারি করুন, 50 বা তার বেশি ক্রিপ্টো র্যান্ড অক্ষর এবং একটি নিরাপদ কুকিতে স্টাফ বলুন।
  • ইউজারসেশন টেবিলে সেই সেশন কীটি যুক্ত করুন।
  • তারপরে আপনি যখন সেই ব্যবহারকারীটিকে আবার দেখেন, প্রথমে সেশনকিটি বৈধ লগইনটাইম এবং লাস্টসাইনটাইম এবং ব্যবহারকারী মুছে ফেলা হয়নি কিনা তা দেখতে প্রথমে ইউজারসেশন টেবিলটি চাপুন। আপনি এটি নকশা করতে পারেন যাতে কোনও টাইমার স্বয়ংক্রিয়ভাবে ইউজারসেশনে পুরানো সারিগুলি সাফ করে দেয়। "

8
আমরা এখানে এসও-তে একটি স্বয়ংসম্পূর্ণ সাইট পছন্দ করি, সুতরাং আপনি কি এখানে সমাধান পোস্ট করতে মনস্থ করবেন? ঠিক সময়ে যদি লিঙ্কটি সময়মতো পরিবর্তিত হয় (লিঙ্ক পচা এবং অন্য কী ...) ভবিষ্যতের দর্শকরা এতে খুশি হতে পারে।
টপস্কিপ

এটি একটি ন্যায্য প্রশ্ন, শ্রদ্ধার সাথে বলা। ধন্যবাদ. আমি সমাধানটি অন্তর্ভুক্ত করেছি; আপনার কি মনে হয় লেখকের নামও অন্তর্ভুক্ত করা উচিত? (এটি সর্বজনীন, তবে যে কোনও বিকল্পের শিষ্টাচার সম্পর্কে আমি অবাক হই))
সেক্সএক্সলাইটার

আমি মনে করি এটি যেমনটি ঠিক তেমন ভাল। আপনি এই স্নিপেটের "মালিক" হিসাবে দাবি করবেন না এবং আমি দেখতে পাচ্ছি না যে এই স্নিপেটের মূল লেখকের জন্য প্রতিটি অনুলিপিটির প্রয়োজন হয়। (কেবলমাত্র আমার দুটি সেন্ট)
টপস্কিপ

35
আপনার ডাটাবেসে কোনও "পাসওয়ার্ডসাল্ট" ক্ষেত্র থাকা উচিত নয়, কারণ আপনার বিসিক্রিপটি আপনার হ্যাশিং অ্যালগরিদম হিসাবে ব্যবহার করা উচিত যা স্বয়ংক্রিয়ভাবে একটি লবণ তৈরি করে এবং ফেরত হ্যাশটিতে অন্তর্ভুক্ত করে। একটি ধ্রুবক সময় তুলনা ফাংশন ব্যবহার করুন।
0xdabbad00

4
Bcrypt এর জন্য +1। এছাড়াও, এর 'এনক্রিপশন' এবং 'প্রমাণীকরণ' কীগুলির সাথে গরিলা সেশনগুলি আপনাকে কোনও ডিবি টেবিল ব্যবহার না করে নিরাপদে সেশন তথ্য সংরক্ষণ করতে দেয়।
ক্র্যানটোক

18

আর একটি সম্ভাব্য সমাধান হ'ল অউথবস , সম্প্রতি মেলিং তালিকায় ঘোষণা করা ।

(আমি এই গ্রন্থাগারটি ব্যবহার করার চেষ্টা করিনি।)

এছাড়াও ব্যবহারকারী লেখক দিয়ে একটি ওয়েব অ্যাপ তৈরি করার সেরা উপায়টি দেখুন?


14

আপনি প্রমাণীকরণ করতে মিডলওয়্যার ব্যবহার করবেন।

আপনি বেসিক এবং ডাইজেস্ট প্রমাণীকরণ এবং OAuth2 এর জন্য গমনিয়াথের জন্য go-http-auth চেষ্টা করতে পারেন ।

তবে কীভাবে সত্যায়িত করবেন তা আপনার অ্যাপের উপর নির্ভর করে।

প্রমাণীকরণ আপনার http.Handlers মধ্যে রাষ্ট্র / প্রসঙ্গ পরিচয় করিয়ে দেয় এবং ইদানীং সম্পর্কে সে সম্পর্কে কিছু আলোচনা হয়েছে।

প্রসঙ্গ সমস্যাটির সুপরিচিত সমাধানগুলি হ'ল এখানে বর্ণিত গরিলা / প্রসঙ্গ এবং গুগল প্রসঙ্গ

আমি চলতে চলতে / মোড়কের ক্ষেত্রে বিশ্বব্যাপী রাষ্ট্রের প্রয়োজন ছাড়াই আরও সাধারণ সমাধান করেছি যা একসাথে বা অন্য দুটি ব্যবহার করা যেতে পারে এবং প্রসঙ্গমুক্ত মিডলওয়্যারের সাথে সুন্দরভাবে সংহত করে।

wraphttpauth go-on-wrap এর সাথে go-http-auth এর সংহতকরণ সরবরাহ করে।


নতুনদের সাথে অনেক নতুন জিনিস রয়েছে। আমি ভাবছি কী ধরণের জিনিস যা এর সাথে কোনও শিক্ষানবিস শুরু করা উচিত। go-http-authনা gomniauthনাকি দুজনেই?
ক্যাস্পার

এখানে যে কেউ গোলংয়ে OAuth 1.0 প্রয়োগ করেছেন? কনজিউমারকি এবং গোপনীয় ভিত্তিক প্রমাণীকরণ?
ব্যবহারকারী 2888996

আমি কীভাবে oAuth 1.0 প্রয়োগ করতে পারি? গ্রাহক কী এবং গোপন ব্যবহার করছেন? সাহায্য করুন. আমি এর জন্য কোনও লাইব্রেরি পাচ্ছি না।
ব্যবহারকারী 2888996

10

2018 সালে এর উত্তর দেওয়া। আমি জেডাব্লুটিটি (জেএসএন ওয়েব টোকেন) ব্যবহার করার পরামর্শ দিই। আপনি যে উত্তরটি সমাধান করেছেন তা হ্রাস পেয়েছে, যা এটি সামনে (ব্যবহারকারী) এবং পিছনে (সার্ভার / ডিবি) করা ট্রিপ। ব্যবহারকারী যদি ঘন ঘন অনুরোধ করেন যার জন্য লেখকের প্রয়োজন হয়, তবে কী খারাপ তা ফলস্বরূপ সার্ভার এবং ডাটাবেস থেকে / অনুরোধে অনুরূপ ফলিত হবে। এই ব্যবহারটি সমাধানের জন্য JWT যা ব্যবহারকারীর প্রান্তে টোকেন সংরক্ষণ করে যা ব্যবহারকারীর দ্বারা যে কোনও সময় এটির অ্যাক্সেস / অনুরোধ প্রয়োজন। টোকেনের বৈধতা স্বল্প সময়ের জন্য পরীক্ষা করতে ডাটাবেস এবং সার্ভার প্রসেসিংয়ের প্রয়োজন নেই।


6

কুকিজ প্রমাণীকরণের পরিচালনা করার জন্য আরেকটি ওপেন সোর্স প্যাকেজ httpauth

(আমার দ্বারা লিখিত, উপায় দ্বারা)


2

সত্যি বলতে, প্রচুর পরিমাণে প্রমাণীকরণ পদ্ধতি এবং কৌশল রয়েছে যা আপনি আপনার অ্যাপ্লিকেশনটিতে মাউন্ট করতে পারেন এবং এটি অ্যাপ্লিকেশন ব্যবসায়ের যুক্তি এবং প্রয়োজনীয়তার উপর নির্ভর করে।
উদাহরণস্বরূপ 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!!

আপনি একবারে একাধিক প্রমাণীকরণ পদ্ধতি সক্ষম করতে পারেন। আপনার সাধারণত কমপক্ষে দুটি পদ্ধতি ব্যবহার করা উচিত


1

ল্যাবস্ট্যাক ইকোটি একবার দেখুন - এটি RESTful APIs এর প্রমাণীকরণকে মোড় দেয় এবং মিডওয়্যারগুলিতে সম্মুখভাগ অ্যাপ্লিকেশনগুলি নির্দিষ্ট করে যা আপনি নির্দিষ্ট এপিআই রুটগুলি সুরক্ষিত করতে ব্যবহার করতে পারেন।

মৌলিক প্রমাণীকরণ স্থাপন করা, উদাহরণস্বরূপ, /adminরুটের জন্য একটি নতুন সাব্রোটার তৈরি করার মতোই সোজা :

e.Group("/admin").Use(middleware.BasicAuth(func(username, password string, c echo.Context) (bool, error) {
    if username == "joe" && password == "secret" {
        return true, nil
    }
    return false, nil
}))

ল্যাবস্ট্যাকের সমস্ত মিডলওয়্যার প্রমাণীকরণ বিকল্পগুলি এখানে দেখুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.